如果我写下面的代码,
class MainClass
{
static EventHandler _myEvent= delegate{};
static event EventHandler MyEvent
{
add{_myEvent += value;}
remove{_myEvent -= value;}
}
public static void Main (string[] args)
{
MyEvent(null,EventArgs.Empty);
}
}
编译器会抱怨:错误CS0079:事件MainClass.MyEvent' can only appear on the left hand side of
+ ='或` - ='运算符。
为什么存在像这样奇怪的东西?如果我不能直接发射事件,为什么我会首先使用这样的东西?这是一个错误(我使用单声道)还是故意精致的设计?谁能请教我这背后的理由?提前谢谢。
答案 0 :(得分:2)
您只能访问声明课程中的活动。在幕后,.NET创建私有实例变量来保存委托。
编译器实际上是在创建一个公共事件和一个私有字段。您可以直接从同一个类或嵌套类访问该字段。从外部类中,您只能被允许订阅/取消订阅。
Jon Skeet提供了很好的信息here,了解其原因及其运作方式。
答案 1 :(得分:2)
您需要调用手动声明的支持委托来引发事件:将MyEvent(null, EventArgs.Empty)
替换为_myEvent(null, EventArgs.Empty)
。如果您考虑一下,自定义添加/删除可能会将代理存储在任何地方,这就是为什么您无法按照编写它的方式检索和调用它们...