如何声明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
相关产品推荐
相关产品推荐

