当形参数组的类型为
object[]
时,在方法的正常形式和单个object
形参的扩展形式之间可能产生潜在的多义性。产生此多义性的缘由是object[]
自己可隐式转换为object
。然而,此多义性并不会形成任何问题,这是由于能够在须要时经过插入一个强制转换来解决它。数组
—CSharp Language Specification 中文版code
然而假设存在ci
static int F(params object[] objs) { // do something }
而在其余地方试图调用it
Console.WriteLine(F((object)new object[] { }));
那么它会在转换 (object)
这里爆提示io
转换是多余的。
显示可能的修补程序 (Ctrl+.)class
然而其实是否去掉这个 (object)
强制类型转换操做的结果是不同的。扩展
有强制类型转换时:object
objs {object[1]} [0]: {object[0]}(来自即时窗口)foreach
没有强制类型转换时:程序
{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
以上。