当前,我正在使用.Net 3.5,所以请让我知道它是否已在更高版本中修复。
目前,我有两种具有以下签名的方法:
void Method1(string, string)
void Method1(string, params string[])
如果我打这样的电话
Method1("test1", "test2")
编译器如何知道要调用的方法?为什么.Net允许这样做?
我假设在IL中,结果代码是不同的,因此可以使用,但不应这样,因为您会得到意想不到的结果。是否有充分的理由允许这样做?
提前致谢。
编译器如何知道要调用的方法?
它遵循C#语言规范中列出的重载解决规则。特别是在7.5.3.2节中(查看C#4规范,但我相信C#5在此处具有相同的编号)-“更好的功能成员”:
如果参数类型的顺序是等效的,则应用以下平局决胜规则,以确定更好的函数成员:unesdoc.unesco.org unesdoc.unesco.org
- ...
- 否则,如果M P是适用在其正常形式和M Q具有
params
阵列和仅在其膨胀形式是适用的,则M P大于M更好Q。
因此,在您的示例中,这将称为第一个重载。
为什么.Net允许这样做?
因为它在各种情况下(例如Console.WriteLine
开始)都非常有用。
我假设在IL中,结果代码是不同的,因此可以使用,但不应这样,因为您会得到意想不到的结果。
如果您不希望C#编译器遵循其规范,则只会得到意想不到的结果。在这种情况下,几乎任何行为都可能是意外的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句