【发布时间】:2011-01-20 19:49:24
【问题描述】:
我经常想这样写:
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) },
},
}
初始化器语法只是糖,为什么编译器不能弄清楚如何为事件订阅生成代码?
给点糖,宝贝!
当初始化器语法被发明时,一定有人考虑过事件并拒绝了它们。我一直在尝试想象其中的原因可能是什么,但我一直处于空白状态。
是因为一个事件是一个多播对象,可能有多个订阅者吗?不,这是一个初始化过程;不能有其他订阅者。 [已更新]不正确,初始化器在构造后应用,对象可以subscribe to its own events。
给 Eric 的说明:我听说过为什么 C# 不实现特性 X 演讲。在这种情况下,已经有人在那里实现了初始化程序。
更新
似乎存在争用/混淆,因为我在示例中使用了Click =。实际语法与问题无关。它可以很容易地成为Click +=,它反映了您必须正常添加处理程序的方式。我更喜欢前者,因为它与初始化器语法的其余部分一致,但最终我不在乎,只要我可以订阅初始化器列表中的事件即可。
另一个更新
我确实意识到现在添加该功能可能不太可能。想到的第一个问题是 Intellisense 必须更新。现在可能还有许多其他事情会阻碍添加此功能。我的问题是:他们为什么不首先添加它。一定是有什么令人信服的东西阻止了“反对”的投票。
【问题讨论】:
-
事件不适用于分配。你必须使用 +=,所以这个语法是不正确的(因为 Click 是一个事件)对吧?
-
我认为这与“当前的合法语法”无关。这是一种附加语法,特定于初始化程序。
标签: c#