我尝试了以下代码:
class Program: ProgParent
{
public int Max(params int[] op)
{
return 0;
}
public int Max(int i, params int[] op)
{
return 1;
}
public int Max(int i, int j, params int[] op)
{
return 2;
}
public static void Main(string[] args)
{
System.Console.WriteLine((new Program()).Max(5, 6, 7, 8));
System.Console.ReadKey();
}
}
它执行,并使用最具体的功能。但编译器没有给出任何警告或错误。为什么呢?
答案 0 :(得分:4)
C#语言规范说:
执行重载解析时,带参数数组的方法 可以适用于其正常形式[即传递一个数组]或 其扩展形式[即传递可变数量的参数]。该 扩展形式的方法只有在正常形式的情况下才可用 方法不可用,并且只有具有相同签名的方法 因为扩展形式尚未以相同的类型声明“
在(稍微简化)简言之:如果重载决策不明确,编译器会选择非params重载。
我猜这个决定的原因(而不是像你这样的代码非法)包括:
答案 1 :(得分:2)
忽略构建错误(我将其归结为错别字) - 您期望或想要什么警告?它正在寻找匹配的重载并使用它......
严格地说,我可以调用不同的重载 - 通过传递数组,但是,使用情况并不完全清楚。
如果没有params
的多次重载,此模式在string.Concat
等内容中使用得非常多(对于发动机罩下的字符串,它支持+
。)