You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#脚本API能否无需指定类型自动推断委托参数类型?

问题:CSharpScript自动推断委托参数类型的方法

现有可正常运行的代码

string actionString = "(p1,p2)=>p1.HP-=20";

var options = ScriptOptions.Default.AddReferences(typeof(SimplePlayer).Assembly).AddImports("Player");

var script = CSharpScript.Create<Action<SimplePlayer, SimplePlayer>>(actionString, options);

SimpleDeck d = new SimpleDeck(Game.GameController.Cards, 100, 100);

SimplePlayer p1 = new SimplePlayer(4000, 100, 100, d);
SimplePlayer p2 = new SimplePlayer(4000, 100, 100, d);

var del = script.CreateDelegate();

del.DynamicInvoke(p1, p2);
System.Console.WriteLine(p1.HP);

尝试的无指定委托类型的代码

我希望实现相同功能,但无需指定预期委托类型,尝试了如下代码:

string actionString = "(p1,p2)=>p1.HP-=20";

var options = ScriptOptions.Default.AddReferences(typeof(SimplePlayer).Assembly).AddImports("Player");

var script = CSharpScript.Create(actionString, options);

SimpleDeck d = new SimpleDeck(Game.GameController.Cards, 100, 100);

SimplePlayer p1 = new SimplePlayer(4000, 100, 100, d);
SimplePlayer p2 = new SimplePlayer(4000, 100, 100, d);

var del = script.CreateDelegate();

del.DynamicInvoke(p1, p2);

运行报错

error CS8917: The delegate type could not be inferred.

修改参数类型后的代码

若将代码中的actionString修改为:

string actionString = "(SimplePlayer p1,SimplePlayer p2)=>p1.HP-=20";

核心疑问

是否存在无需显式传递SimplePlayer类型作为参数,也无需执行var script = CSharpScript.Create<Action<SimplePlayer, SimplePlayer>>(actionString, options);这类操作,就能自动推断SimplePlayer类型的方法?


解答

不存在这样的自动推断方式,原因如下:

  • CSharpScript在处理无显式类型声明的lambda表达式时,仅通过p1.HP这种成员调用无法确定参数的具体类型——毕竟可能有多个类都包含HP属性,脚本引擎没有足够上下文锁定到SimplePlayer。
  • 要让脚本正确识别参数类型,必须提供明确的类型信息:要么在lambda的参数列表里显式标注SimplePlayer类型,要么在调用CSharpScript.Create时指定具体的委托类型(比如Action<SimplePlayer, SimplePlayer>)。
  • 如果想减少重复代码,可以封装一个通用方法,传入参数类型来生成脚本,避免每次手动编写完整的委托类型声明,但本质上还是需要显式提供类型信息。

内容的提问来源于stack exchange,提问作者Rafael Acosta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:25:47