gpt4 book ai didi

c# - 带有方法重载和枚举的奇怪(可能是错误的?)C# 编译器行为

转载 作者:可可西里 更新时间:2023-11-01 08:41:43 25 4
gpt4 key购买 nike

今天我发现了 C# 函数重载的一个非常奇怪的行为。当我有一个带有 2 个重载的方法,一个接受 Object 而另一个接受任何类型的 Enum 时,就会出现问题。当我将 0 作为参数传递时,将调用该方法的枚举版本。当我使用任何其他整数值时,将调用对象版本。我知道这可以通过使用显式转换轻松解决,但我想知道为什么编译器会那样做。这是一个错误还是我不知道的一些奇怪的语言规则?

下面的代码解释了这个问题(使用运行时 2.0.50727 进行了检查)

感谢您对此的任何帮助,格热戈日基奇

class Program
{
enum Bar
{
Value1,
Value2,
Value3
}

static void Main(string[] args)
{
Foo(0);
Foo(1);
Console.ReadLine();
}

static void Foo(object a)
{
Console.WriteLine("object");
}

static void Foo(Bar a)
{
Console.WriteLine("enum");
}
}

最佳答案

您可能没有意识到存在从 0 的常量1 到任何枚举的隐式转换:

Bar x = 0; // Implicit conversion

现在,从 0 到 Bar 的转换比从 0 到 object 的转换更具体,这就是为什么 Foo(Bar) 使用过载。

这一切都清楚了吗?


1 Microsoft C# 编译器中实际上存在一个错误,它允许它是任何零常量,而不仅仅是一个整数:

const decimal DecimalZero = 0.0m;

...
Bar x = DecimalZero;

这不太可能得到修复,因为它可能会破坏现有的工作代码。我相信 Eric Lippert 有两个 blog posts其中更详细。

C# 规范第 6.1.3 节(C# 4 规范)对此有如下说明:

An implicit enumeration conversionpermits the decimal-integer-literal 0to be converted to any enum-type andto any nullable-type whose underlyingtype is an enum-type. In the lattercase the conversion is evaluated byconverting to the underlying enum-typeand wrapping the result (§4.1.10).

这实际上表明错误不仅在于允许错误的类型,还在于允许转换任何常量 0 值,而不仅仅是字面值 0。

编辑:看起来“常量”部分是 partially introduced in the C# 3 compiler .以前它是一些常量值,现在看起来都是它们。

关于c# - 带有方法重载和枚举的奇怪(可能是错误的?)C# 编译器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3153841/

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