簡體   English   中英

C# 和可變數量的參數

[英]C# and variable number of parameters

我嘗試了以下代碼:

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

它執行並使用可用的最具體的 function。 但是編譯器對此沒有給出警告或錯誤。 為什么?

C# 語言規范說:

在執行重載決議時,帶有參數數組的方法可以以它的正常形式[即傳遞一個數組]或它的擴展形式[即傳遞可變數量的參數]適用。 方法的擴展形式僅在方法的正常形式不可用並且僅當與擴展形式具有相同簽名的方法尚未在相同類型中聲明時才可用"

簡而言之(稍微簡化):如果重載決議不明確,編譯器會選擇非參數重載。

我猜這個決定的原因(而不是讓像你這樣的代碼非法)包括:

  • 如果您的方法具有簽名:void fn(params object[] p),您希望有某種方式來調用“正常形式”(通過傳遞 object[])。 所以編譯器無論如何都必須處理模棱兩可的情況。
  • 創建臨時數組比方法調用要昂貴得多,因此您可能希望創建具有 1、2、3 個參數的非參數重載,這些參數的行為相同但效率更高。 (例如 String.Format)

忽略構建錯誤(我將其歸結為拼寫錯誤)-您期望或想要什么警告? 它正在尋找匹配的重載並使用它......

嚴格來說,我可以調用不同的重載——通過傳遞 arrays,但是是的,用法並不完全清楚。

如果沒有params的多個重載,這種模式在string.Concat等(它支持+用於引擎蓋下的字符串)中被大量使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM