为什么.Net允许这些模糊的方法

Cod*_*asy 0 .net c# methods signature ambiguous

目前我正在使用.Net 3.5所以请告诉我它是否已在以后的版本中修复.

目前我有2种方法,具有以下签名:

void Method1(string, string)
void Method1(string, params string[])
Run Code Online (Sandbox Code Playgroud)

如果我打这样的电话

Method1("test1", "test2")
Run Code Online (Sandbox Code Playgroud)

编译器如何知道调用哪个方法?为什么.Net允许这个?

我假设在IL中,生成的代码是不同的,因此允许,但它不应该,因为你可以得到意想不到的结果.是否允许这样做有充分的理由吗?

提前致谢.

Jon*_*eet 7

编译器如何知道调用哪个方法?

它遵循C#语言规范中列出的重载解析规则.特别是在第7.5.3.2节(查看C#4规范,但我相信C#5在这里有相同的编号) - "更好的功能成员":

如果参数类型seqquences等效[...],则按顺序应用以下打破平局的ruls,以确定更好的函数成员:

  • ...
  • 否则,如果M P是适用在其正常形式和M Q具有params阵列和仅在其膨胀形式是适用的,则M P大于M更好Q.

所以在你的例子中,它将调用第一个重载.

为什么.Net允许这个?

因为它在各种情况下都很有用(例如Console.WriteLine,一开始).

我假设在IL中,生成的代码是不同的,因此允许,但它不应该,因为你可以得到意想不到的结果.

如果您不希望C#编译器遵循其规范,则只会得到意外结果.在这种情况下,几乎任何行为都可能是意料之外的.