【发布时间】:2021-08-01 15:56:23
【问题描述】:
当我运行以下类型检查代码时,它会产生结果:
True
False
这是为什么?
Module VBModule
Class TypeKey(Of T)
Public Sub New()
End Sub
Public Shared Operator =(k0 As TypeKey(Of T), k1 As TypeKey(Of T)) As Boolean
Return True
End Operator
Public Shared Operator <>(k0 As TypeKey(Of T), k1 As TypeKey(Of T)) As Boolean
Return False
End Operator
Public Shared Operator =(k0 As TypeKey(Of T), k1 As Object) As Boolean
Return False
End Operator
Public Shared Operator <>(k0 As TypeKey(Of T), k1 As Object) As Boolean
Return True
End Operator
End Class
Public Function is_same_type(Of U, V)() As Boolean
Return New TypeKey(Of U)() = New TypeKey(Of V)()
End Function
Sub Main()
Console.WriteLine(New TypeKey(Of Integer)() = New TypeKey(Of Integer)())
Console.WriteLine(is_same_type(Of Integer, Integer)())
End Sub
End Module
在在线 VBNET IDE 上进行测试时,没有任何警告。
【问题讨论】:
-
因为
is_same_type(Of U, V)是compiled once,而不是每个U, V。因此,它是根据编译时已知的U, V编译的,即它们是object。 -
也许您已经习惯了 C++ 模板并且期望泛型的行为方式相同?如果您想检查类型是否相等,可以使用
Type进行检查。如果你想让is_same_type工作,那么你不能使用Operator,因为它们不能是通用的(除了包含类),所以你不能得到一个适用于两个可能不同的类型参数在TypeKey;您需要编写一个非运算符函数。