除非必要,否则不会扩展参数

以下程序:

class Program
{
    static void Method(params Object[] objects)
    {
        System.Console.WriteLine(objects.Length);
    }   
    static void Method(Object a, Object b)
    {
        System.Console.WriteLine("two");
    }
    static void Main(string[] args)
    {
        object[] objectArray = new object[5];

        Method(objectArray);
        Method(objectArray, objectArray);
        Method(objectArray, objectArray, objectArray);
    }
}

将打印:

5
two
3

调用表达式 Method(objectArray) 可以用两种方式解释:一个 Object 参数恰好是一个数组(因此程序会输出 1,因为这将是参数的数量,或者作为参数数组,以正常形式给出,好像方法 Method 没有关键字 params。在这些情况下,正常的非扩展形式总是优先。所以,程序输出 5

在第二个表达式 Method(objectArray, objectArray) 中,第一种方法的扩展形式和传统的第二种方法都适用。在这种情况下,非扩展形式也优先,因此程序打印 two

在第三个表达式 Method(objectArray, objectArray, objectArray) 中,唯一的选择是使用第一种方法的扩展形式,因此程序打印 3