Hei*_*nzi 10 c# vb.net enums casting overload-resolution
请考虑以下最小示例:
Module Module1
    Private Enum MyEnum
        A
    End Enum
    Public Sub Main(args As String())
        AreEqual(CType(0, MyEnum), MyEnum.A)    ' Error here
    End Sub
    Private Function AreEqual(Of T)(item1 As T, item2 As T) As Boolean
        Return False
    End Function
    Private Function AreEqual(item1 As Object, item2 As Object) As Boolean
        Return False
    End Function
End Module
由于某些奇怪的原因,标记为"Error here"的行中的重载解析失败:
错误6重载决策失败,因为没有可访问的'AreEqual'对这些参数最具体:
Private Function AreEqual(item1 As Object, item2 As Object) As Boolean:不是最具体的.
Private Function AreEqual(Of MyEnum)(item1 As MyEnum, item2 As MyEnum) As Boolean:不是最具体的.
为什么第二个功能不是"最具体"的?双方CType(0, MyEnum)并MyEnum.A应该是静态类型的表达式MyEnum.
有趣的是,我只能通过铸造枚举来重现这个问题.AreEqual(CType(0, Int32), 0)并且AreEqual(MyEnum.A, MyEnum.A)都编译没有问题.
我知道如何解决这个问题.我知道我可以使用AreEqual(Of MyEnum)(...).这不是问题.我很好奇为什么会这样.一些编译器bug?有趣的是,相应的C#代码确实有效:
enum MyEnum { A, B }
static void Main(string[] args)
{
    AreEqual((MyEnum)0, MyEnum.A);
}
static bool AreEqual<T>(T item1, T item2) { return false; }
static bool AreEqual(object item1, object item2) { return false; }
诚然,我在这里有点难以理解,但以下内容不会产生任何错误。
AreEqual(CType(CType(0, Int16), MyEnum), MyEnum.A) 
然而
AreEqual(CType(CType(0, Integer), MyEnum), MyEnum.A) 
做。
AreEqual(CType(1, MyEnum), MyEnum.A)
编译也很好。
如果这是无稽之谈或无用的,我们深表歉意。
| 归档时间: | 
 | 
| 查看次数: | 262 次 | 
| 最近记录: |