考虑下面的最小示例:
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。有趣的是,执行以下任何操作均会消除该错误:
是的。疯狂的东西,很好找到海因兹!
关于c# - 使用CType'd Enum的重载分辨率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28881840/