6

今天我发现了一件奇怪的事情。我想知道为什么会这样:

static void Main(string[] args)
{
    Console.WriteLine(ExampleMethod(3));
    Console.ReadKey();
}

public static string ExampleMethod(int required, params int[] optionalint)
{
    return "ExampleMethod 2";
}

public static string ExampleMethod(int required, string optionalstr = "default string", int optionalint = 10) 
{
    return "ExampleMethod 1";
}

想一想:调用 ExampleMethod(3) 的结果是什么;

在我看来,这会导致不可预测的结果。在我的情况下,总是调用方法 1。但是当我更改方法 1 的签名时,主方法称为方法 2(当然)。

我没想到会出现这样的行为,我预计会出现“AmbiguousReferenceException”或至少是编译器警告。

4

1 回答 1

5

我期望这种行为,因为编译器知道默认值,optionalstr因此optionalint能够根据该值做出决定使用什么值。它不知道将什么设置为int[] optionalint. 因为当你有可选参数时,编译器“更确定”使用什么,所以它调用那个方法。

如果您添加了这样的额外方法

public static string ExampleMethod(int required)
{
    return "ExampleMethod 3";
}

这将是调用的方法,因为编译器将首先选择没有可选参数的方法。

关于重载解析的更详细解释。

于 2013-06-30T12:25:23.253 回答