gpt4 book ai didi

c# - 使用 CType 的枚举解决重载问题

转载 作者:可可西里 更新时间:2023-11-01 09:15:30 30 4
gpt4 key购买 nike

考虑以下最小示例:

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”的行中失败:

Error 6 Overload resolution failed 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(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 中)是对象。有趣的是,执行以下任何操作都会消除错误:

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

是的。疯狂的东西,很高兴找到 Heinzi!

关于c# - 使用 CType 的枚举解决重载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28881840/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com