C#: IntelliSense 貌似作錯了一些事情。

當形參數組的類型爲 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

以上。

相關文章
相關標籤/搜索