在代码中:
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 Option Strict On 不允许从 'wokka.SomeDerived' 到 'wokka.ISelf(Of wokka.ISelf(Of wokka.SomeDerived))' 的隐式转换,因为转换不明确。” 与从 Z7 到 Z8 或从 Z8 到 Z9 的分配相比,该分配如何更加模棱两可?据我所知,所有三个分配都必须是保留表示的转换,这意味着所有三个必须简单地存储对与 Z7 相同的对象的引用。
我可以理解,如果我试图将 的实例分配给SomeDerived
type 的引用ISelf(Of ISelf(Of SomeBase))
,则尝试访问该接口的成员可能会从SomeBase
or中产生实现SomeDerived
;如果成员是返回类型的方法TMe
,我可以理解这种歧义可能导致编译失败(因为编译器不知道返回类型是什么)。不过,我很困惑,为什么仅仅尝试分配引用会因为“歧义”而失败,因为分配不可能被解释为除了对引用类型变量的引用的直接存储之外的任何东西?
顺便说一句,预期的用途是ISelf(Of T)
包含一个只读属性Self
type T
,预期的实现将是Return This
[在每种情况下都保留表示形式的转换;我想我应该在 中添加一个类约束TMe
,但它不会影响原始问题]。如果有多种类都对实现感兴趣ISelf(Of theirOwnTypes)
,那么应该可以利用 的协方差ISelf
来促进一些原本会很困难的事情[例如,如果每个类都对实现IMoe
、ILarry
和/或ICurly
等感兴趣。还实现了相应的类ISelfAndMoe(Of ItsOwnType)
ISelfAndLarry(Of ItsOwnType) 和/或 ISelfAndCurly(Of ItsOwnType), etc. then one can accept a parameter type which is known to implement any combination of those interfaces e.g.
ISelfAndMoe(Of ISelfAndLarry(Of ICurly)) param . Given that declaration,
param would implement
IMoe , and
param.Self would implement
ILarry , and
param.Self.Self would implement
ICurly . Further, if the class implements the expected pattern, one could cast
param to e.g.
ISelfAndCurly(Of IMoe) , if one wanted to call a routine which needed those two interfaces but didn't need
ILarry`(如果实现做了一些意想不到的事情,这种转换可能会失败,但如果对象的类如下则应该成功预期的模式)。