我经常想写这样的东西:
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必须更新。可能还有许多其他的因素会阻碍现在添加这个特性。我的问题是:为什么他们一开始不加。一定有什么很有说服力的东西让“不”的选票变了。
发布于 2011-01-20 20:19:48
尝试简单地分配一个事件:
Click = (o,e) => { <CODE> }不起作用。初始化器只适用于您可以直接分配的东西。这是因为事件需要能够通知任何他们想要的人(您不应该被允许删除其他人的注册为该事件的意外)。
我不确定这是不是他们的推理,但这对我有用。
发布于 2013-04-02 22:17:47
是的,应该是语言的一部分!
但是,这里有一个棘手的解决方法,可以让您订阅初始化程序列表中的事件.
public class TestClass
{
public class MyButton : Button
{
public EventHandler ClickSubscriber
{
get { return null; }
set { Click += value; }
}
}
public static void RunTest()
{
new Form
{
Text = "Caption",
Controls =
{
new MyButton
{
ClickSubscriber = (s, e) =>
MessageBox.Show("Button 1 Clicked"),
},
},
};
}
}https://stackoverflow.com/questions/4751837
复制相似问题