C#和可变数量的参数

时间:2009-03-31 07:01:44

标签: c# params

我尝试了以下代码:

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();
        }
    }

它执行,并使用最具体的功能。但编译器没有给出任何警告或错误。为什么呢?

2 个答案:

答案 0 :(得分:4)

C#语言规范说:

  

执行重载解析时,带参数数组的方法   可以适用于其正常形式[即传递一个数组]或   其扩展形式[即传递可变数量的参数]。该   扩展形式的方法只有在正常形式的情况下才可用   方法不可用,并且只有具有相同签名的方法   因为扩展形式尚未以相同的类型声明“

在(稍微简化)简言之:如果重载决策不明确,编译器会选择非params重载。

我猜这个决定的原因(而不是像你这样的代码非法)包括:

  • 如果你的方法有签名:void fn(params object [] p),你想有办法调用“普通形式”(通过传递一个对象[])。所以编译器无论如何都必须处理模糊的情况。
  • 创建临时数组比方法调用要昂贵得多,因此您可能希望使用1,2,3参数创建非params重载,这些参数行为相同但效率更高。 (例如String.Format)

答案 1 :(得分:2)

忽略构建错误(我将其归结为错别字) - 您期望或想要什么警告?它正在寻找匹配的重载并使用它......

严格地说,我可以调用不同的重载 - 通过传递数组,但是,使用情况并不完全清楚。

如果没有params的多次重载,此模式在string.Concat等内容中使用得非常多(对于发动机罩下的字符串,它支持+。)