目前我正在使用。net 3.5,所以请让我知道它是否已在以后的版本中修复。
目前我有2个签名如下的方法:
void Method1(string, string)
void Method1(string, params string[])
如果我打这样一个电话
Method1("test1", "test2")
编译器如何知道调用哪个方法?为什么。net允许这样呢?
我假设在IL中,结果代码是不同的,因此是允许的,但不应该这样,因为您可能会得到意想不到的结果。这是允许的,有什么好的理由吗?
编译器如何知道调用哪个方法?
它遵循c#语言规范中列出的重载解析规则。特别是,在第7.5.3.2节(查看c# 4规范,但我相信c# 5在这里有相同的编号)- &;Better Function member &;:
如果参数类型序列相等[…]为了确定更好的函数成员,应用了以下断接规则:
- …
- 否则,如果MP的正常形式适用,MQ有
params
数组且只适用于其展开形式,则MP优于MQ。
在你的例子中,它将调用第一个重载。
为什么。net允许这个?
因为它可以在各种情况下有用(例如,Console.WriteLine
为开始)。
我假设在IL中,结果代码是不同的,因此是允许的,但不应该这样,因为您可能会得到意想不到的结果。
如果你不希望c#编译器遵循它的规范,你只会得到意想不到的结果。在这种情况下,几乎任何行为都可能是意想不到的。