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

FooIGraphItem / IGraphNodeIGraphItem / IGraphNode的实现均位于单独的程序集中。我正在使用控制容器的反转,因此我正在处理的项目引用了前两个(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它。如果我错了,不应该让我抛出异常吗?有没有更好的方法来完成我要做的事情?

最佳答案

即使目标框架为3.5,原始代码也可以毫无问题地进行编译。

当前代码的问题在于,您已定义了通用方法,而IGraphItem不是接口的类型,而是通用类型T,它可以是任何类型。但是它不能是T以外的其他类型,并且您试图将其强制转换为Foo类型。

如果将方法签名更改为其他方法,则可以使用,例如:

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


我假设您以某种方式用通用类型IGraphItem来“遮盖”界面的类型IGraphItem

如果您明确告诉编译器item As IGraphItem实际上是item As YourNamespace.IGraphItem,它也将起作用。

我确定Jon或Eric可以更好地解释它,但无论如何它可能还是有帮助的;)

09-26 14:55