Initializing events with initializer syntax

前端 未结 4 1132
情书的邮戳
情书的邮戳 2020-12-07 01:57

I often want to write something like this:

new Form
{
    Text = \"Caption\",
    Controls =
    {
        new Button { Text = \"Button 1\", Click = (s, e) =         


        
4条回答
  •  遥遥无期
    2020-12-07 02:29

    There's a big difference between fields and events. There's an excellent article here outlining the differences, but that's the answer to your question: A field can be assigned a value; an event looks like a field but is a very different beast.

    Edit

    From the article I linked to:

    We have seen that the event keyword is a modifier for a delegate declaration that allows it to be included in an interface, constrains its invocation from within the class that declares it, provides it with a pair of customizable accessors (add and remove), and forces the signature of the delegate

    Remember that event is a shortcut; behind the scenes, the compiler creates an object with add() and remove() methods. Like:

    public class Button {
    
        public event EventHandler Click {
            void add {...}
            void remove {...}
        }
    
    }
    

    Perhaps this will offer some insight... :

    Button btn = new Button {Click += (s, e) => MessageBox.Show("hello")};
    

    The error message you get is "Cannot initialize type 'Button' with a collection initializer because it does not implement IEnumerable"


    Still another note... if you assign the event handler from within the form, you can do this:

    this.button1.Click += (s, e) => this.textBox1.Text = e.ToString();
    

    You couldn't access form variables from the code you've created. I get where you're coming from, and I don't disagree... what you're doing could be made to work. I guess my point is that there are reasons why the decision was made not to make it work.

提交回复
热议问题