为什么.net允许诸如此类的模糊方法



目前我正在使用。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的正常形式适用,MQparams数组且只适用于其展开形式,则MP优于MQ

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

为什么。net允许这个?

因为它可以在各种情况下有用(例如,Console.WriteLine为开始)。

我假设在IL中,结果代码是不同的,因此是允许的,但不应该这样,因为您可能会得到意想不到的结果。

如果你不希望c#编译器遵循它的规范,你只会得到意想不到的结果。在这种情况下,几乎任何行为都可能是意想不到的。

相关内容

  • 没有找到相关文章

最新更新