T[])params 參數using System;
class App {
// 第一個參數固定為 int,後續可變參數為 object[]
public static void UseParams(int id, params object[] list) {
Console.WriteLine($"ID: {id}");
foreach (var item in list) Console.WriteLine(item);
}
static void Main() {
// 傳入 3 個字串
UseParams(1, "a", "b", "c");
// 傳入 4 個不同型別引數(隱含裝箱)
UseParams(2, "d", 100, 33.33, new double[] { 1.1, 2.2 });
// 直接傳入陣列
UseParams(3, new object[] { "e", 200 });
// 零參數
UseParams(4);
Console.ReadLine();
}
}
ID: 1
a
b
c
ID: 2
d
100
33.33
System.Double[]
ID: 3
e
200
ID: 4
// C# 13+ (提案階段) 或手動封裝
public void Log(string format, params T[] args) { /* ... */ }
// 目前通用做法:params object[] + 文檔約定
public static class StringExtensions {
public static string FormatWith(this string fmt, params object[] args)
=> string.Format(fmt, args);
}
// 用法: "Hello {0}, {1}".FormatWith("World", 2024);
void Foo(params int[] nums) { }
int[] arr = {1,2,3};
Foo(arr); // 傳入陣列本身,nums.Length == 3
Foo(1,2,3); // 編譯器建立新陣列,nums.Length == 3
Foo(new[]{1,2}); // 同理
若需區分「單一陣列引數」與「多個引數」,請勿使用 params,改用多載:
void Bar(int[] arr) { } // 明確接收陣列
void Bar(params int[] nums) { } // 編譯錯誤:多載模糊
params 方法,編譯器都會在呼叫端產生 new object[] { ... }(或對應型別陣列)params 版本供便利呼叫,核心邏輯用 ReadOnlySpan<T> 或陣列多載實作編譯器將 params 標記為 [ParamArrayAttribute],呼叫端 IL 會顯式 newarr 建立陣列並填入引數。這就是為什麼 params 僅限陣列型別且必須在最後的原因。
string.Format、Console.WriteLine、Enumerable.Concat)object[] 失去型別資訊)params(實作者易忘記加屬性)