C#传入带参方法为Action参数报错无法从method group转换为Action怎么解决
问题根因
Action是无参数、无返回值的委托类型,你定义的foo方法需要传入1个AnotherClass类型参数,对应的委托签名是Action<AnotherClass>,二者类型不匹配,因此编译时会报方法组无法转换为Action的错误。
修复方案
不需要修改Choice类中A的Action类型,只需要用无参数lambda表达式闭包捕获已经实例化的AnotherClass对象Bar,在lambda内部调用传入Bar的foo方法即可,相当于把带参数的方法调用包装成了符合Action签名的无参数委托。
需要同步修正你代码里的两个小问题:
- 声明的
Bar没有初始化,需要先实例化才能正常传入foo使用 Choice类没有定义Invoke方法,你需要调用A属性的Invoke来执行委托
修改后的关键代码片段:
static void Main() { AnotherClass Bar = new AnotherClass(); // 先实例化Bar // 用lambda包装带参数的foo调用,匹配Action签名 Choice c = new Choice("Desc", () => foo(Bar)); c.A.Invoke(); // 执行委托 }
完整可运行的修改后代码:
class Choice { public string Description { get; set; } public Action A { get; set; } public Choice() { Description = ""; A = delegate { }; } public Choice(string Description, Action A) : this() { this.Description = Description; this.A = A; } } class AnotherClass { // Details of AnotherClass... } // 如果foo和Main在同一个类内,需要加static修饰才能在静态Main方法中调用 public static void foo(AnotherClass AC) { // do something with AC... Console.WriteLine("foo executed"); } static void Main() { AnotherClass Bar = new AnotherClass(); Choice c = new Choice("Desc", () => foo(Bar)); c.A.Invoke(); }
如果foo是实例方法,只需要在lambda里用对应实例调用即可,格式为() => 你的类实例.foo(Bar)。
内容的提问来源于stack exchange,提问作者samyung_c
相关产品推荐
相关产品推荐

