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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:24:03