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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:18:04