我经常想写这样的东西:
new Form
{
Text = "Caption",
Controls =
{
new Button { Text = "Button 1", Click = (s, e) => MessageBox.Show("Button 1 Clicked"), Location = new Point(10, 10) },
new Button { Text = "Button 2", Click = new EventHandler(Button2Clicked), Location = new Point(10, 40) },
new Button { Text = "Button 3", Click = Button3Clicked, Location = new Point(10, 70) },
},
}
初始化语法只是一种简化方式,那么为什么编译器不能推断出如何生成事件订阅的代码呢?
给我一些糖,宝贝!
当初始化语法被发明时,肯定有人考虑过事件并且拒绝了它们。我一直在试图想象可能的理由,但是一无所获。
是因为事件是一个可以有多个订阅者的多播对象吗?不,这是一个初始化过程;不可能有其他订阅者。[已更新] 不对,初始化器是在构造后应用的,一个对象可以订阅自己的事件。
致Eric的一封信:我听过“为什么C#没有实现X功能”的演讲。但在这种情况下,已经有人在实现初始化器了。
更新
似乎有争议/混淆,因为我在示例中使用了Click =
。实际的语法与问题无关。它可以很容易地是Click +=
,这反映了通常必须添加处理程序的方式。我更喜欢前者,因为它与其余初始化程序语法一致,但最终我不在意,只要我能在初始化程序列表中订阅事件。
另一个更新
我确实意识到现在添加该功能可能不太可能。首先想到的问题是Intellisense必须得到更新。可能还有许多其他事情会妨碍现在添加此功能。我的问题是:为什么他们一开始没有添加它。肯定存在某些引人注目的原因导致否决投票。