C# params 允許方法接受可變數量參數,本質上是陣列。呼叫時常見錯誤:直接傳遞多個引數卻忘記語法規則,導致「輸入字串格式不正確」或編譯錯誤。
public void GetInfo(params int[] numbers) {
foreach (int n in numbers) Console.WriteLine(n);
}
// 方式一:傳遞多個獨立引數 (編譯器自動包裝成陣列)
GetInfo(1, 2, 3, 4, 5);
// 方式二:傳遞現有陣列變數
int[] arr = { 10, 20, 30 };
GetInfo(arr);
// 方式三:new 陣列內聯
GetInfo(new int[] { 100, 200 });
// 方式四:零引數 (合法,numbers 為空陣列)
GetInfo();
| 錯誤代碼 | 問題 | 修正 |
|---|---|---|
GetInfo(1, 2, 3) 在字串格式化語境中 | 非 params 問題,而是格式化字串佔位符不匹配 | 檢查 String.Format 佔位符與引數數量 |
s.GetInfo() 括號內無引數但預期有值 | 需傳遞陣列或引數列表 | s.GetInfo(new int[]{...}) 或 s.GetInfo(1,2,3) |
傳遞 List<int> | 型別不匹配 | GetInfo(list.ToArray()) |
params 只能出現在參數列表最後一個位置。params 與陣列參數 (如 void M(int[] a) vs void M(params int[] a)),會造成歧義。params 每次呼叫都會配置陣列 (除非傳入現有陣列),高頻熱路徑可提供陣列多載避免配置。核心:呼叫時要么傳「逗號分隔的引數列表」,要么傳「陣列變數」,別混淆兩者語法。