泛型函数中忽略重载

当我运行以下类型检查代码时,它会产生结果:

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 上进行测试时,没有警告。

kyoaguai 回答:泛型函数中忽略重载

没有警告

那是因为您有另一个带有 Object 参数的重载。所以,它又回到了那个状态。

好吧,为什么它首先返回到带有 Object 参数的重载?

那是因为 Overload Resolution 在编译时处理,而不是在运行时处理。在编译期间,编译器对您的类型 V 一无所知。它无法知道它实际上与 U 在这个特定实例中是相同的类型。因此,它总是使用 Object 的重载。

您实际上可以通过两种方式确认这一点:

  1. 如果您将鼠标悬停在 = 运算符上,您可以看到正在使用的重载是 =(k0 As TypeKey(Of U),k1 As Object)

    enter image description here

  2. 如果您删除(或注释掉)该重载,您会收到带有以下消息的编译器错误:

    重载解析失败,因为无法使用这些参数调用可访问的“=”:

    'Public Shared Operator =(k0 As VBModule.TypeKey(Of U),k1 As VBModule.TypeKey(Of U)) As Boolean':类型'VBModule.TypeKey(Of V)'的值不能转换为' VBModule.TypeKey(Of U)'。

    Try it online.

本文链接:https://www.f2er.com/1427.html

大家都在问