当形参数组的类型为 object[] 时,在方法的正常形式和单个 object 形参的扩展形式之间可能产生潜在的多义性。产生此多义性的原因是 object[] 本身可隐式转换为 object。然而,此多义性并不会造成任何问题,这是因为可以在需要时通过插入一个强制转换来解决它。

—CSharp Language Specification 中文版

然而假设存在

static int F(params object[] objs)
{
    // do something
}

而在其他地方试图调用

Console.WriteLine(F((object)new object[] { }));

那么它会在转换 (object) 这里爆提示

转换是多余的。
显示可能的修补程序 (Ctrl+.)

然而实际上是否去掉这个 (object) 强制类型转换操作的结果是不一样的。

有强制类型转换时:

objs
{object[1]}
   [0]: {object[0]}

(来自即时窗口)

没有强制类型转换时:

{object[0]}

官方示例:

using System;
class Test
{
    static void F(params object[] args) {
        foreach (object o in args) {
            Console.Write(o.GetType().FullName);
            Console.Write(" ");
        }
        Console.WriteLine();
    }
    static void Main() {
        object[] a = {1, "Hello", 123.456};
        object o = a;
        F(a);
        F((object)a);
        F(o);
        F((object[])o);
    }
}

可产生输出

System.Int32 System.String System.Double
System.Object[]
System.Object[]
System.Int32 System.String System.Double

以上。


_CRY
1.2k 声望24 粉丝

How dare we sit quietly