为什么这个C#重载与nullables不模糊?

时间:2018-05-04 20:49:21

标签: c# compilation overloading

为什么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);替换第二种方法会导致编译错误。

1 个答案:

答案 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