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

时间:2015-10-06 15:08:30

标签: c# .net methods signature ambiguous

目前我正在使用.Net 3.5,如果已在更高版本中修复,请告诉我。

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

void Method1(string, string)
void Method1(string, params string[])

如果我打这样的电话

Method1("test1", "test2")

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

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

提前致谢。

1 个答案:

答案 0 :(得分: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#编译器遵循其规范,则只能获得意外结果。在这种情况下,几乎任何行为都是意料之外的。