C#调用MyEvent触发CS0070编译器错误是什么原因?如何修复?
CS0070 编译错误原因与修复方案
触发原因
C#中event关键字是对委托类型的封装,自带访问限制规则:
- 仅事件所属类的内部代码,可以直接调用、触发事件,或者访问事件背后的委托实例
- 类的外部仅能对事件执行
+=注册委托、-=移除委托操作,不允许直接触发事件,也不允许直接访问事件对应的委托实例调用Invoke方法
你当前的报错代码是在Program类中调用Demo类实例的MyEvent事件的Invoke方法,属于类外部的非法操作,因此触发CS0070错误。你之前用反射注册事件的逻辑是符合规则的,没有问题。
修复方案
方案1(推荐,符合C#设计规范)
在事件所属的Demo类内部新增公开的事件触发方法,外部通过调用该方法间接触发事件,保证事件的封装安全性。
修改后的Demo类代码如下:
class Demo { public event EventHandler<int> MyEvent; public void Handler(object sender, int arg) { Console.WriteLine($"I just go {arg}"); } // 新增公开触发方法 public void TriggerMyEvent(int arg) { MyEvent?.Invoke(this, arg); } }
将Program类中的报错行替换为调用触发方法即可:
// 替换原报错行 demo.TriggerMyEvent(312);
方案2(不推荐,破坏封装性)
如果你的业务场景确实需要外部直接操作委托实例,可以去掉event关键字,将MyEvent直接声明为公开的委托字段:
// 将Demo类中的原事件声明 // public event EventHandler<int> MyEvent; // 修改为 public EventHandler<int> MyEvent;
修改后原demo.MyEvent?.Invoke(null, 312);代码可以正常执行。
内容的提问来源于stack exchange,提问作者Morteza Amini
相关产品推荐
相关产品推荐

