3

私は継承構造を持っています: Fooimplements IGraphNodeinherits IGraphItem

FooIGraphItem/ 、および/IGraphNodeの実装はすべて別のアセンブリに存在します。私は制御コンテナーの反転を使用しているため、作業中のプロジェクトには最初の 2 つ (および/ ) への参照がありますが、 /の実装はありません。このプロジェクトに必要なため、Option Strict もオンにしています (オフにしても問題は解決しませんでした)。.NET 3.5 を使用しています。IGraphItemIGraphNodeFooIGraphItemIGraphNodeIGraphItemIGraphNode

私は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あることを確認したばかりなので、できない理由がわかりません。私が間違っている場合は、例外をスローさせてはいけませんか? 私がやろうとしていることを達成するためのより良い方法はありますか?itemFooDirectCast

4

2 に答える 2

2

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

現在のコードの問題は、ジェネリック メソッドを定義したことですが、これIGraphItemはインターフェイスの型ではなく、T任意の型にできるジェネリック型です。しかし、別の型にすることはできず、 typeTにキャストしようとしていますFoo

メソッドのシグネチャを他のものに変更すると、次のように機能します。

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

このメソッドIGraphItemのジェネリック型を使用して、インターフェイスの型を何とか「シャドウイング」していると思います。IGraphItem

実際item As IGraphItemitem As YourNamespace.IGraphItem.

ジョンかエリックならもっとうまく説明できると思いますが、とにかく役に立つかもしれません ;)

于 2012-05-02T18:53:46.810 に答える
1

この記事はあなたの質問に答えるかもしれません。そうでない場合でも、とにかく優れた読み物です。 http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx

于 2012-05-02T17:02:00.787 に答える