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

如何声明BarDelegate委托以使其可添加至Action<Bar>?

问题解决方法

你的代码报错是因为自定义的BarDelegate和预定义的Action<Bar>是不同的委托类型——即使签名完全一致,C#也不允许两者之间的隐式转换。要实现预期行为,有两种针对BarDelegate的声明方案:

方案一:将BarDelegate声明为Action的别名

在命名空间级别(而非类内部)用using关键字把BarDelegate定义为Action<Bar>的别名,这样两者本质是同一类型,可直接兼容:

using BarDelegate = System.Action<Bar>;

public class Bar { }

public class Xzxxy
{
    private Action<Bar> BarAction;

    public void Add(BarDelegate bd)
    {
        BarAction += bd;
    }

    public void Invoke(Bar bar)
    {
        // 增加空判断避免空引用异常
        BarAction?.Invoke(bar);
    }
}

方案二:保持自定义委托,添加时显式转换

如果必须在类内部声明BarDelegate,可以保留原有委托定义,但在添加到BarAction时进行显式类型转换:

public class Bar { }

public class Xzxxy
{
    public delegate void BarDelegate(Bar bar);
    private Action<Bar> BarAction;

    public void Add(BarDelegate bd)
    {
        // 显式转换为Action<Bar>类型
        BarAction += (Action<Bar>)bd;
    }

    public void Invoke(Bar bar)
    {
        BarAction?.Invoke(bar);
    }
}

额外建议

如果没有特殊业务需求,完全可以省去自定义的BarDelegate,直接用Action<Bar>作为Add方法的参数,代码会更简洁:

public class Bar { }

public class Xzxxy
{
    private Action<Bar> BarAction;

    public void Add(Action<Bar> action)
    {
        BarAction += action;
    }

    public void Invoke(Bar bar)
    {
        BarAction?.Invoke(bar);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 01:20:17