c#:无法访问父类的事件?

从来没见过这个。 这是样本:

using System; namespace Testing { public class Test { public event Action ActionRequired; } public class ChildTest : Test { public void DoSomething() { if (this.ActionRequired != null) this.ActionRequired(); } } } 

这不起作用,错误是我只能从基类访问该事件。

到处运行并不困难(向基类添加一个受保护的方法,它既可以检查事件的调用,也可以从子类中调用该方法),但我真的很想知道这个限制背后的想法是什么?

干杯,

SEBI

您无法从定义它们的类外部调用事件。 但是,你不需要; 只需遵循惯用的模式,同时声明一个受保护的方法来触发所述事件。

 class Whatever { public event EventHandler Foo; protected virtual void OnFoo( EventArgs e ) { EventHandler del = Foo; if( del != null ) { del( this, e ); } } } 

现在,类“Whatever”的后代可以通过调用OnFoo()并传入适当的EventArgs对象来触发事件。

编辑:关于为什么这是行为,Jon Skeet在另一个线程中解释得很好(这也意味着这个问题是重复的,所以投票结束):

声明类似公共字段的事件时,编译器会创建公共事件和私有字段。 在同一个类(或嵌套类)中,您可以直接访问该字段,例如调用所有处理程序。 从其他类中,您只能看到该事件,该事件仅允许订阅和取消订阅。

您在示例中用于声明事件的语法实际上是语法糖,如下所示:

 private Action _actionRequired; public event Action ActionRequired { add { _actionRequired += value; } remove { _actionRequired -= value } } 

(当然实际代码有点复杂)

这里的重要部分是_actionRequired字段是私有的。 只有事件本身是公共的,但它只是一对添加/删除方法(类似于属性)。 因此,您可以对该事件做的唯一事情是订阅或取消订阅。 保存实际委托的字段是私有的,因此只能从声明它的类中访问它。 在声明它的类中使用ActionRequired时,它会引用委托字段或事件本身,具体取决于上下文。

但是从任何其他类中,只有事件是可访问的,而不是字段。 这就是为什么你不能从另一个类,甚至派生类调用委托。

按照之前的答案@ThomasLevesque添加https://stackoverflow.com/a/4742280/3926461

你可以在不使用这种语法糖的情况下声明你的动作如下所示:

  public class Test { protected Action _actionRequired; public event Action ActionRequired { add { _actionRequired += value; } remove { _actionRequired += value; } } } public class ChildTest : Test { public void DoSomething() { if (this._actionRequired != null) this._actionRequired(); } }