以下代码在C#4.0中编译:
void Foo(params string[] parameters) { }
void Foo(string firstParameter, params string[] parameters) { }
Run Code Online (Sandbox Code Playgroud)
编译器如何知道您调用的是哪个重载?如果它不能,为什么代码仍然编译?
Han*_*ant 13
它在C#语言规范第7.4.3.2节"更好的功能成员"中有详细说明:
否则,如果MP以其正常形式适用且MQ具有params数组且仅适用于其扩展形式,则MP优于MQ
否则,如果MP的声明参数少于MQ,则MP优于MQ.如果两个方法都具有params数组并且仅适用于它们的扩展形式,则会发生这种情况.
Fwiw,C#语言规范是一个非常易读的文档,可以帮助您自己解决这些难题.您可以在计算机上找到它,然后在vc#\ specifications\1033子目录中的Visual Studio安装目录(如c:\ program files\microsoft visual studio 9.0)中找到它.
另一个好的是Ecma-335标准文档,可以PDF免费下载.它指定了CLR和JIT编译器的行为,这是理解为什么C#(和CLR)做他们所做的事情的好材料.推荐的.
在某些情况下,它会为您决定.因此,您可能希望在这种情况下使用不同的名称(或者在更有用的情况下:-)).
特别是,在四种情况中:
Foo("bar");
Foo("bar", "bar");
Foo(new string[]{"bar", "bar"});
Foo("bar", new string[] { "bar", "bar" });
Run Code Online (Sandbox Code Playgroud)
只有#1和#2是"模糊的"(因为#3和#4分别自然地匹配过载1和2).
在#1和#2情况下,重载决策选择重载#2,因为它具有与调用的唯一/第一个参数匹配的独立字符串参数.
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |