3

我有继承结构:Foo实现IGraphNode继承IGraphItem

Foo, IGraphItem/和/IGraphNode的实现都位于单独的程序集中。我正在使用控制容器的反转,因此我正在处理的项目引用了前两个(和/ ),但没有/的实现。我还打开了 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,但由于我们刚刚确认item' 类型是Foo,我不明白为什么我不能DirectCast这样做。如果我错了,它不应该让我抛出异常吗?有没有更好的方法来完成我想要做的事情?

4

2 回答 2

2

即使目标框架是 3.5,您的原始代码也可以毫无问题地编译。

您当前代码的问题是您定义了一个泛型方法,而IGraphItem不是您的接口的类型,而是T可以是任何类型的泛型类型。但它不能是另一种类型,T并且您正在尝试将其强制转换为 type Foo

如果您将方法签名更改为其他任何内容,它将起作用,例如:

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

我假设你在某种程度上用这个方法中IGraphItem的泛型类型“遮蔽”了你的接口类型。IGraphItem

如果您明确告诉编译器item As IGraphItem实际上是一个item As YourNamespace.IGraphItem.

我敢肯定 Jon 或 Eric 可以更好地解释它,但也许它还是有帮助的;)

于 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 回答