Cod*_*asy 0 .net c# methods signature ambiguous
目前我正在使用.Net 3.5所以请告诉我它是否已在以后的版本中修复.
目前我有2种方法,具有以下签名:
void Method1(string, string)
void Method1(string, params string[])
Run Code Online (Sandbox Code Playgroud)
如果我打这样的电话
Method1("test1", "test2")
Run Code Online (Sandbox Code Playgroud)
编译器如何知道调用哪个方法?为什么.Net允许这个?
我假设在IL中,生成的代码是不同的,因此允许,但它不应该,因为你可以得到意想不到的结果.是否允许这样做有充分的理由吗?
提前致谢.
编译器如何知道调用哪个方法?
它遵循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#编译器遵循其规范,则只会得到意外结果.在这种情况下,几乎任何行为都可能是意料之外的.
归档时间: |
|
查看次数: |
152 次 |
最近记录: |