为什么C#允许以下方法重载:
void F(int a) { Console.WriteLine(1); }
void F(int? a) { Console.WriteLine(2); }
如果我运行该代码:
A a = new A();
a.F(1);
打印1
。编译器如何知道要调用哪一个。不是很模糊吗?
我认为可空类型背后的想法是你可以传递正确类型的值,或者你可以传递null
。因此,我应该能够使用F
和(1)
来调用第一个F
(1)
和第二个(null)
。
我有一个可运行的示例here。
更新 在阅读答案之后,我的困惑源于这样一个事实:我认为可以为空的params是可选参数的同义词。
实际上,用void F(int a = 0);
替换第二种方法会导致编译错误。
答案 0 :(得分:8)
int?
实际上是一个Nullable<int>
结构,因此区分两者。
以下调用应打印2
int? a = 0;
F(a);
关于以下电话......
A a = new A();
a.F(1);
1
字面值为int
,而不是int?
,因此它转到void F(int a)
方法。如果您将null
传递给方法,则它不能是int
,因此它转到void F(int? a)
方法,因为它是一个可以为null的数据类型。
两种方法都能够接受1
值,但编译器将选择最具体的重载,在这种情况下,重载是接受完全相同类型的重载int
。