目前我正在使用.Net 3.5,如果已在更高版本中修复,请告诉我。
目前,我有两种方法具有以下签名:
void Method1(string, string)
void Method1(string, params string[])
如果我打这样的电话
Method1("test1", "test2")
编译器如何知道调用哪种方法?为什么.Net允许这个?
我假设在IL中,生成的代码是不同的,因此允许,但它不应该,因为你可以得到意想不到的结果。是否有充分理由允许这样做?
提前致谢。
答案 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#编译器遵循其规范,则只能获得意外结果。在这种情况下,几乎任何行为都是意料之外的。