我开始读他的书,其中包含了C#4.0节乔恩斯基特的早期版本的访问,并有一两件事让我吃惊。 不幸的是我没有Visual Studio 2010中可用的,所以我想我只是在这里问来代替,看看有没有人知道答案。
如果我有下面的代码,现有的代码混合,以及新的代码:
public void SomeMethod(Int32 x, Int32 y) { ... }
public void SomeMethod(Int32 x, Int32 y, Int32 z = 0) { ... }
编译器会抱怨无论是在定义站点或对可能的歧义调用点?
举例来说,究竟会这段代码实际上做?
SomeClass sc = new SomeClass();
sc.SomeMethod(15, 23);
它会编译? 它会调用不具备z参数之一,还是会叫一个与Z参数?
它将编译没有警告,首先会选择超载。
通过引入可选和命名参数,C#的重载解析机制已变得非常复杂。 在这种特殊情况下,这是有道理的。然而。 像往常一样,编译器将选择的参数匹配的最具体的过载。
我不相信这种特定情况下是从C#1.0太大的不同:
public void SomeMethod(Int32 x, Int32 y) { }
public void SomeMethod(Int32 x, Int32 y, params Int32[] z) { }
它的工作原理相同(在重载决议的条款)。
后续回答:我不这么认为。 恐怕你要手动指定在方法调用默认参数。 但是,如果x
或y
参数有不同的名称,如:
public void SomeMethod(Int32 x, Int32 y) { }
public void SomeMethod(Int32 t, Int32 y, Int32 z = 0) { }
你可以选择与第二过载:
obj.SomeMethod(t: 10, y: 20);
这涵盖了本章的“重载”部分。
当编译器有两个,否则,等于可供选择的方案,它将使用,并不需要优先于一个没有使用任何未供给可选参数过载,但它是一个严格的二元选择。 如果有一个未供给可选参数和两个过载之间做出选择,它会认为是一个不明确的情况。
要回答你的跟进评论,我不知道强迫过载与可选参数的任何方式没有具体说明使用。 你不能使用其中任一,例如:
// Both invalid
sc.SomeMethod(15, 23, );
sc.SomeMethod(15, 23, z:)
但是,如果你的方法使用不同的参数名,你能做到这一点,则:
public void SomeMethod(Int32 x, Int32 y) { ... }
public void SomeMethod(Int32 a, Int32 b, Int32 c = 0) { ... }
sc.SomeMethod(a: 15, b: 23); // Calls second method
文章来源: Does C# 4.0 and a combination of optional parameters and overloads give you a warning about ambiguity?