为什么对于相同类型的不同值重载方法的C#调用不同?

12

关于C#方法重载和调用解析,我有一个疑问。

假设我有以下的C#代码:

enum MyEnum { Value1, Value2 }

public void test() {
    method(0); // this calls method(MyEnum)
    method(1); // this calls method(object)
}

public void method(object o) {
}

public void method(MyEnum e) {
}
请注意,我知道如何使其工作,但我想知道为什么对于一个int值(0),它调用一种方法,而对于另一个值(1),它调用另一种方法。这听起来很尴尬,因为这两个值具有相同的类型(int),但它们与不同的方法“链接”。

这也适用于以下语句: MyEnum e = 0; 但是,如果写成以下形式,您将会得到编译器错误(需要显式转换): MyEnum e = 1; - RockWorld
为什么C++允许将字面量零(0)隐式转换为任何枚举类型? - Binary Worrier
3个回答

8

字面值0可以隐式转换为任何enum类型,这比object更匹配。 规范.

例如,参见这些博客文章


1
0可以隐式转换为任何枚举类型,而1则不行! - Ahmed
4
根据C#语言规范(第1.10节)所述:“为了使枚举类型的默认值易于使用,字面量0会隐式转换为任何枚举类型。” - Fredrik Mörk

1

我很确定要调用

public void method(MyEnum e) {
}

正确的做法是传入 MyEnum.Value1 或者 MyEnum.Value2。枚举类型不等于整型,因此你需要将整型强制转换为你的枚举类型。所以 (MyEnum)1 或者 (MyEnum)0 才能正常工作。

在你的情况下,0 被隐式地转换为了你的枚举类型。


2
虽然你的回答(大部分)是正确的,但那不是 OP 所问的。 - Fredrik Mörk
我仍然认为值得提及,因为使用MyEnum.Value1比假定0会隐式转换为枚举更易于阅读。这样你就不必担心掉入错误的重载方法中。 - Bryan Denny
1
你说得对;那绝对是最佳实践。然而,它并没有回答问题。 - SLaks

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接