私は継承構造を持っています:Foo
はIGraphNode
を継承していますIGraphItem
を継承しています。ここで二重キャストする必要があるのはなぜですか?
Foo
、IGraphItem
/IGraphNode
、及びIGraphItem
/IGraphNode
全ての実装は、別のアセンブリに存在します。私はコントロールコンテナの反転を使用しているので、私が作業しているプロジェクトは、最初の2つ(Foo
とIGraphItem
/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
できないのか分かりません。もし私が間違っていれば、それは私に許可して例外を投げるべきではありませんか?私がやろうとしていることを達成するためのより良い方法はありますか?
ないで何が起こっているかを確認しますが、それはコンパイルし、実行時にも動作します。どのようなコンパイルエラーがありますか? –
@TimSchmelter: 'IGraphItem'型の値が 'Foo'エラーに変換できません。 .NET 3.5を使用していることを追加する質問が更新されました。 –
私は3.5にターゲットフレームワークを変更すると、私は多くの例外を得ています。しかし、アイテム( '' IGraphNode'型)を 'Foo'と打ち込むことは問題ありません。 –