gpt4 book ai didi

vb.net - 为什么我必须在这里双投?

转载 作者:行者123 更新时间:2023-12-05 01:37:01 26 4
gpt4 key购买 nike

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

FooIGraphItem/IGraphNode,以及IGraphItem/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 不是您的接口(interface)类型,而是泛型类型 T 可以是任何类型类型。但它不能是 T 以外的其他类型,并且您正在尝试将其强制转换为类型 Foo

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

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

我假设您在该方法中使用通用类型 IGraphItem 以某种方式“隐藏”了接口(interface)的类型 IGraphItem

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

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

关于vb.net - 为什么我必须在这里双投?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10418269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com