跳到主要内容

params 参数

C# 方法尾部的 params T[] 在 Lua→C# 时按 展开优先(对齐 C# params),与普通 T[] 形参不同。权威细则:02-MARSHAL-AS §7、重载规范 §3.3。

入门摘要见 函数调用。

和普通 T[] 的差别​

普通 T[] 形参params T[]
展开多槽 Foo(1, 2, 3)不支持支持(元素类型为 T)
省略视是否可选 / 可空→ T[0](空数组,不是 null)
整段 T[] userdata支持支持(恰好 1 个实参且可赋给 T[])
Lua table 当整个数组支持(数组形态 table)不支持
单独 nil 当整个 null 数组可(→ null 引用)不支持(nil 只能是展开中的一个元素)

无 专用 LuaMarshalType(历史 ParamsTable 已移除)。

基本用法​

static void Sum(params int[] values) { /* … */ }
static void Prefix(int head, params int[] tail) { /* … */ }
static void CountNulls(params string[] values) { /* … */ }
-- 展开
Demo.Sum(1, 2, 3)
Demo.Sum() -- → int[0]
Demo.Prefix(0, 1, 2) -- head=0, tail={1,2}

-- 整段:已有 T[] userdata(如 zlua.new_szarray_*)
Demo.Sum(arr)

-- nil 是元素,不是 null 数组
Demo.CountNulls(nil) -- string[]{ null }
Demo.CountNulls("a", nil, "b")

不要这样写​

-- ✗ table 不能当整个 params 数组
-- Demo.Sum({ 1, 2, 3 })

-- ✗ 单独 nil 不能当 null 的 int[]
-- Demo.Sum(nil)

-- 若手里只有 Lua table:先做成 T[] userdata,再整段传入
local arr = zlua.new_szarray_by_element_type(zlua.types.int32, 3)
arr[0], arr[1], arr[2] = 1, 2, 3
Demo.Sum(arr)

数组构造见 数组。

与重载​

带 params 的候选可接受实参个数为 [minLuaArity, +∞)。选优时:转换分数相同后,整段 userdata 优于 展开;再相同则 非 params 候选优于带 params 的(对齐 C# 定参优先)。详见 方法重载。

不支持的范围​

场景态度
普通方法 / 构造上的 params✅
GetFunction 取得的 delegate 调用❌
delegate bridge(C# 调 Lua 回调)上的 params❌

见 09-FUNCTION。

常见错误​

现象处理
Sum({1,2,3}) mismatchtable 不能整段给 params;改展开或先造 T[] userdata
Sum(nil)(params int[])int 元素不接受 nil;省略写 Sum() → int[0]
期望多槽隐式收集却走了定参重载定参优先;用全签名键或改掉冲突重载
GetFunction / 回调上的 params不支持;改成显式 T[] 形参

学习路径​

上一篇方法重载
下一篇LuaAlias

相关文档​