我有继承结构:Foo
实现IGraphNode
继承IGraphItem
。Foo
,IGraphItem
/ IGraphNode
和IGraphItem
/ IGraphNode
的实现均位于单独的程序集中。我正在使用控制容器的反转,因此我正在处理的项目引用了前两个(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
它。如果我错了,不应该让我抛出异常吗?有没有更好的方法来完成我要做的事情? 最佳答案
即使目标框架为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可以更好地解释它,但无论如何它可能还是有帮助的;)