C#方法重载与参数和可选参数

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)时,会得到什么结果?

在我看来,这会导致一个不可预测的结果。在我的情况下,总是调用了Method 1。但是当我改变了Method 1的签名时,Main Method调用了Method 2(当然)。

我没有预料到这样的行为,我期望会有一个"AmbiguousReferenceException"或至少是一个编译器警告。


简短回答:因为规范是这样规定的。http://www.microsoft.com/en-us/download/details.aspx?id=7029 - Tim S.
1个回答

5
我会翻译此内容。编译器知道optionalstroptionalint的默认值,因此可以根据这些值做出决策并选择使用哪些值。对于int[] optionalint的值它不知道应该怎么设置。由于在有可选参数的情况下编译器更加确信要使用哪些值,所以会调用该方法。如果您添加了一个额外的方法如下:
public static string ExampleMethod(int required)
{
    return "ExampleMethod 3";
}

这将是被调用的方法,因为编译器首先会选择没有可选参数的方法。有关重载决策的更详细的解释

重载解析的规则非常详细。这个类似问题的答案提供了更多信息:https://dev59.com/JHA75IYBdhLWcg3wo6pe - Kevin Nacios
谢谢,我已经将链接添加到答案中。 - keyboardP
啊,好的,那很有道理。谢谢你。我没有想到在一个版本中参数是隐式设置的。 - baschdy
@baschdy - 不用谢。Kevin发布了一个很好的链接,详细介绍了编译器如何解决重载问题。 - keyboardP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接