加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

为什么vb.net拒绝将嵌套协变接口赋值为“模糊”

发布时间:2020-12-17 00:05:41 所属栏目:大数据 来源:网络整理
导读:在代码中: Interface ISelf(Of Out TMe)End InterfaceClass SomeBase Implements ISelf(Of SomeBase)End ClassClass SomeDerived Inherits SomeBase Implements ISelf(Of SomeDerived)End ClassModule ISelfTester Sub TestISelf() Dim z7 As New SomeDeriv
在代码中:
Interface ISelf(Of Out TMe)
End Interface
Class SomeBase
    Implements ISelf(Of SomeBase)
End Class
Class SomeDerived
    Inherits SomeBase
    Implements ISelf(Of SomeDerived)
End Class
Module ISelfTester
    Sub TestISelf()
        Dim z7 As New SomeDerived
        Dim z8 As ISelf(Of SomeDerived)
        Dim z9 As ISelf(Of ISelf(Of SomeDerived))
        z8 = z7
        z9 = z8
        z9 = z7 ' Why is this illegal?
    End Sub
End Module

直接从Z7到Z9的赋值产生消息“错误13选项Strict On不允许从’wokka.SomeDerived’到’wokka.ISelf(Of Wokka.SomeDerived))的隐式转换’,因为转换是模糊的“.那个分配怎么比Z7到Z8,或Z8到Z9的分配更模糊?据我所知,所有三个赋值必须是表示保留转换,这意味着所有三个都必须简单地存储与Z7相同的对象的引用.

我可以理解,如果我试图将SomeDerived的实例分配给类型为ISelf(Of ISelf(Of SomeBase))的引用,则尝试访问该接口的成员可以从SomeBase或SomeDerived获得实现;如果该成员是一个返回类型为TMe的方法,我可以理解这种歧义可能导致编译失败(因为编译器不知道返回类型是什么).但是,我很困惑,为什么仅仅因为“模糊性”而仅仅尝试分配引用失败,因为赋值不能被解释为除了直接存储对引用类型变量的引用之外的任何东西?

顺便说一下,预期的用法是ISelf(Of T)包含一个只读属性类型为Self的类型,其预期的实现将是Return [在每种情况下保持表示的转换;我想我应该为TMe添加一个类约束,但它不会影响原始问题].如果有一个人感兴趣的各种类实现了ISelf(OfOwnTypes),那么应该可以利用ISelf的协方差来促进一些本来很困难的事情[例如如果每个类感兴趣的实现IMoe,ILarry和/或ICurly等,也实现相应的类ISelfAndMoe(Of ItsOwnType),ISelfAndLarry(Of ItsOwnType)和/或ISelfAndCurly(Of ItsOwnType)等等.可以接受已知实现这些接口的任何组合的参数类型,例如ISelfAndMoe(Of ISelfAndLarry(Of ICurly))param.鉴于该声明,param将实现IMoe,和param.Self将实现ILarry,并且param.Self.Self将自己实现.此外,如果类实现了预期的模式,那么可以使用castparamto egISelfAndCurly(Of IMoe),如果有人想要调用需要这两个接口但不需要ILarry的例程(如果实现做了意外的话,这样的转换可能会失败,但如果对象的类遵循预期的模式,则应该成功).

Option Strict On告诉编译器忽略引用隐式转换的简单引用.这是隐含的,因为z9被允许是SomeBase(Of SomeBase(Of SomeDerived))并且因为SomeDerived可以代替SomeBase,编译器不确定你指的是哪一个.但是因为你在z8中明确地说它是ISelf(SomeDerived)没有任何猜测.我怀疑你是否将z9改为ISelf(Of SomeDerived(Of SomeDerived),这种歧义可能会消失.

然而,作为一种观点,这种嵌套变得非常混乱,因为它堆叠在自身上并且可能成为维护的噩梦.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读