考虑下面的最小示例:

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

出于某些奇怪的原因,在标有“此处错误”的行中,重载解析失败:



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

有趣的是,我只能通过强制枚举重现此问题。 AreEqual(CType(0, Int32), 0)AreEqual(MyEnum.A, MyEnum.A)都可以毫无问题地进行编译。

我知道如何解决此问题。 我知道我可以只使用AreEqual(Of MyEnum)(...)。那不是问题。我很好奇为什么会这样。一些编译器错误?有趣的是,相应的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; }

最佳答案

它与整数有关,尤其是零。我认为这是一些不严格的Option Strict人工制品。我注意到CType()的默认返回类型(在Intellisense中)是object。有趣的是,执行以下任何操作均会消除该错误:

  • 给MyEnum任何类型,除了整数
  • AreEqual(0,MyEnum.A)
  • AreEqual(CType(1,MyEnum),MyEnum.A)

  • 是的。疯狂的东西,很好找到海因兹!

    关于c# - 使用CType'd Enum的重载分辨率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28881840/

    10-17 02:16