请问C#4.0和可选参数和重载给你一个歧义警告的组合?(Does C# 4.0 and a comb

2019-09-21 15:12发布

我开始读他的书,其中包含了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参数?

Answer 1:

它将编译没有警告,首先会选择超载。

通过引入可选和命名参数,C#的重载解析机制已变得非常复杂。 在这种特殊情况下,这是有道理的。然而。 像往常一样,编译器将选择的参数匹配的最具体的过载。

我不相信这种特定情况下是从C#1.0太大的不同:

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 x, Int32 y, params Int32[] z) { }

它的工作原理相同(在重载决议的条款)。

后续回答:我不这么认为。 恐怕你要手动指定在方法调用默认参数。 但是,如果xy参数有不同的名称,如:

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 t, Int32 y, Int32 z = 0) { }

你可以选择与第二过载:

obj.SomeMethod(t: 10, y: 20);


Answer 2:

这涵盖了本章的“重载”部分。

当编译器有两个,否则,等于可供选择的方案,它将使用,并不需要优先于一个没有使用任何未供给可选参数过载,但它是一个严格的二元选择。 如果有一个未供给可选参数和两个过载之间做出选择,它会认为是一个不明确的情况。

要回答你的跟进评论,我不知道强迫过载与可选参数的任何方式没有具体说明使用。 你不能使用其中任一,例如:

// 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?