2012-05-02 9 views
3

私は継承構造を持っています:FooIGraphNodeを継承していますIGraphItemを継承しています。ここで二重キャストする必要があるのはなぜですか?

Foo

IGraphItem/IGraphNode、及びIGraphItem/IGraphNode全ての実装は、別のアセンブリに存在します。私はコントロールコンテナの反転を使用しているので、私が作業しているプロジェクトは、最初の2つ(FooIGraphItem/IGraphNode)への参照を持っていますが、実装はIGraphItem/IGraphNodeではありません。私はまた、このプロジェクトに必要とされるようにOption Strictをオンにしています(オフの場合は問題を解決しませんでした)。私は.NET 3.5を使用しています。

私の周りIGraphItemを渡していると私は、このようなコードがあります:私はこれを行うために抱えている理由

Public Sub ProcessItem(of IGraphItem)(item As IGraphItem) 
    If TypeOf item Is Foo Then 
     Dim f1 = CType(item, Foo) 'Compiler error 
     Dim f2 = DirectCast(item, Foo) 'Compiler error 

     'This is what I'm currently having to do. It works. 
     Dim f = CType(CType(item, IGraphNode), Foo) 

     'Do stuff 
    End If 
End Sub 

任意のアイデアを?私はそのTryCastの作品を追加する必要がありますが、itemのタイプがFooであることを確認したので、なぜ私はDirectCastできないのか分かりません。もし私が間違っていれば、それは私に許可して例外を投げるべきではありませんか?私がやろうとしていることを達成するためのより良い方法はありますか?

+0

ないで何が起こっているかを確認しますが、それはコンパイルし、実行時にも動作します。どのようなコンパイルエラーがありますか? –

+0

@TimSchmelter: 'IGraphItem'型の値が 'Foo'エラーに変換できません。 .NET 3.5を使用していることを追加する質問が更新されました。 –

+0

私は3.5にターゲットフレームワークを変更すると、私は多くの例外を得ています。しかし、アイテム( '' IGraphNode'型)を 'Foo'と打ち込むことは問題ありません。 –

答えて

2

ターゲットフレームワークが3.5の場合でも、元のコードは問題なくコンパイルされます。

IGraphItemはインターフェースのタイプではありませんが、汎用タイプTはどのタイプでも構いませんが、現在のコードの問題は汎用メソッドを定義したことです。しかし、T以外のタイプではありません。それをタイプFooにキャストしようとしています。あなたが何かにあなたのメソッドのシグネチャを変更希望の場合

それは、例えば、働くだろう:

Public Sub ProcessItem(of IGraphItm)(item As IGraphItem) 

私はあなたが何らかの形でジェネリック型IGraphItem中であなたのインターフェイスの種類IGraphItemを「シャドーイング」していることを前提としていこの方法。

item As IGraphItemが実際にitem As YourNamespace.IGraphItemであることをコンパイラに明示的に伝えることもできます。

私はジョンやエリックはそれをよりよく説明できると確信している、多分それはとにかく便利です;)

関連する問題