【问题标题】:C# method overload with params and optionals带有参数和选项的 C# 方法重载
【发布时间】:2013-06-30 20:31:00
【问题描述】:

今天我发现了一些奇怪的东西。我想知道为什么会这样:

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”或至少是编译器警告。

【问题讨论】:

标签: c# .net params


【解决方案1】:

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

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

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

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

More detailed explanation 关于重载决议。

【讨论】:

  • 重载解析的规则非常详细。 This answer to a similar question有更多信息:stackoverflow.com/questions/3190248/…
  • 谢谢,我已经添加了答案的链接。
  • 啊,好吧,这是有道理的。谢谢你。到目前为止,我没有想到,在一个版本中,参数是隐式设置的。
  • @baschdy - 不客气。 Kevin 发布了一个很好的链接,其中包含有关编译器如何解决重载的更多详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多