C#事件inheritance

我有这个程序:

class One { public delegate void del(object o); public event del SomethingChanged; int x; public int X { get { return x; } set { x = value; OnSomethingChanged(this); } } protected void OnSomethingChanged(object o) { if (SomethingChanged != null) SomethingChanged(o); } } class Two: One { public void ChangeSomething() { //if (SomethingChanged != null) // SomethingChanged(this); OnSomethingChanged(this); } } static void Main(string[] args) { One one = new One(); Console.WriteLine(one.X); one.SomethingChanged += new One.del(one_SomethingChanged); one.X = 5; } static void one_SomethingChanged(object o) { Console.WriteLine(((One)o).X); } 

有两个类 – 一个和两个,两个是一个的后代。 在Class One(SomethingChanged)中声明了事件,它由Class One和Class Two触发。 但是看看Two.ChangeSomething – 它通过调用基类的方法来引发事件。 但是,如果我尝试使用原始代码调用事件

 if(SomethingChanged!= null)
     SomethingChanged(本);

我收到编译错误说

事件'One.SomethingChanged'只能出现在+ =或 -  =的左侧(除非在'eventtest.Program.One'类型中使用)

所以我只是好奇为什么我不能在第二类中使用’raw’代码来引发事件但是当我调用相应的函数时会引发事件?

[编辑]在这里找到一些澄清: C#:提升inheritance事件

当您在C#中使用“event”关键字声明事件时,生成的IL实际上包含两个相应的元素:私有委托字段和与声明的事件具有相同可见性的事件访问器。 事件访问器不能用于触发事件。 它仅用于订阅和取消订阅通知。 您的SomethingChanged(this)代码使用私有字段来调用委托,并且该私有字段在类外部不可用。

代码

 if (SomethingChanged != null) SomethingChanged(this); 

(顺便说一句,它有竞争条件)意味着在SomethingChanged上调用Delegate.GetInvocationList 。 除非您在定义事件的类中,否则自动实现的事件不允许您这样做。

如果手动实现事件并提供对支持事件的委托字段的protected访问,则可以执行此操作。

看一下子类中的Use事件和委托 。

使用:

 this.SomethingChanged += new One.del(one_SomethingChanged);