跳到主要内容

方法重载

Lua 无静态类型,同名多签名不能靠编译期选定。ZLua 提供:默认分派、全签名键(Bind 自动)、[LuaAlias]、以及 register_method 短名。参考:Demo.Runapp.lua

日常 demo:Run(10)Lua 调用 C# 已够用;歧义或热路径再读本篇。权威细则:重载规范

怎么选

方式写法何时用
默认 dispatchdemo:Run(10)实参能唯一匹配
全签名键(自动)demo['Run(System.Int32)'](demo, 5)精确点名;无需 register_method
[LuaAlias]demo:run_i32(5)能改 C#,热路径短名
register_method注册后 demo:run_i32(5)不能改 C#,又要短名 + 冒号

默认 dispatch

demo:Run(10) -- Run(int)
demo:Run("hello") -- Run(string)

仅一个 public 重载时零分派;多个时按实参匹配。

全签名键(同名冲突时自动注册)

当同一方法名有多个重载(例如 Run(int) / Run(string))时,除 Run 的 dispatch 外,Bind 还会为每个候选挂 direct 键:

方法名(参数 Type.FullName, …)不含返回类型):

含义
Run运行时分派
Run(System.Int32)固定 Run(int)
Run(System.String)固定 Run(string)
-- 精确调用,不必 register_method
demo['Run(System.Int32)'](demo, 5)
demo['Run(System.String)'](demo, "hi")

键名含括号,不能demo:Run(System.Int32)(...),须括号键 + 点号 + 显式 self

[LuaAlias]

[LuaAlias("run_i32")]
public void Run(int value) { }

public void Run(string value) { }
demo:run_i32(10) -- 短名 + 冒号,O(1);Run(int) 已换名,不再挂 "Run"
demo:Run("hi") -- 未换名的 Run(string)

别名是 换名(替换默认 Lua 键),不是追加。XML(luaAliasXmlPaths / ZLuaAlias)与更多例子见 LuaAlias。C# extension 挂实例表见 Extension 方法

register_method:短名 + 冒号

全签名键已经能精确调用,但写法冗长。register_methoddirect closure 挂到尚未占用的短名上;之后可用冒号:

local run_i32 = demo['Run(System.Int32)']
zlua.register_method("run_i32", run_i32)

-- 好处:短名进入 method 表,之后直接
demo:run_i32(5)

两参数形式(与 05-LIB 一致):zlua.register_method(aliasName, directClosure)aliasName 若已存在(含 Run、全签名键、其它别名)→ 报错,不覆盖。

也可从 [LuaAlias] 键取 closure 再挂另一个自定义名。

常见错误

现象处理
调错重载 / ambiguous overload全签名键、[LuaAlias]register_method 短名
想用 demo['(System.Int32)']禁止;必须带方法名:Run(System.Int32)
register_method 报已占用换未使用的别名;不要覆盖 Run / 已有全签名键

学习路径

上一篇0GC Marshal
下一篇LuaAlias

相关文档