c# – 使用CType的Enum重载分辨率

前端之家收集整理的这篇文章主要介绍了c# – 使用CType的Enum重载分辨率前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
请考虑以下最小示例:
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@H_403_3@ 
 

由于某些奇怪的原因,重载分辨率在“Error here”标记的行中失败:

Error 6 Overload resolution @R_403_159@ because no accessible ‘AreEqual’ is most specific for these arguments:

Private Function AreEqual(item1 As Object,item2 As Object) As Boolean: Not most specific.

Private Function AreEqual(Of MyEnum)(item1 As MyEnum,item2 As MyEnum) As Boolean: Not most specific.

为什么第二个功能不是“最具体的”? CType(0,MyEnum)和MyEnum.A都应该是静态键入MyEnum的表达式.

有趣的是,我只能用铸造枚举来重现这个问题. AreEqual(CType(0,Int32),0)和AreEqual(MyEnum.A,MyEnum.A)都编译没有问题.

我知道如何解决这个问题.我知道我可以使用AreEqual(OfEnEnum)(…).这不是问题.我很好奇为什么会发生这种情况.一些编译器的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; }@H_403_3@

解决方法

它与整数相关,特别是零.我认为这是一些非常严格的选择严格的人工制品.我注意到CType()是对象的默认返回类型(在Intellisense中).有趣的是,做任何这些事情会删除错误

>赋予MyEnum任何类型,而不是整数
> AreEqual(0,MyEnum.A)
> AreEqual(CType(1,MyEnum.A)

是的.疯狂的东西,很好找Heinzi!

原文链接:https://www.f2er.com/csharp/94955.html

猜你在找的C#相关文章