button1.OnClick += new EventHandler( this.buttonClick ); 跟 
button1.OnClick += this.buttonClick ; 
一样,呵呵。只是一个是明确进行了类型转换,而一个是隐式的。
一个朋友回答我两句有什么不同的看法,我有点疑惑,这是进行了类型转换吗??
望高手指点下!

解决方案 »

  1.   

    我认为,既不是类型转换也不隐式,而是语法如此,微软规定如此,看MSDN
    以编程方式订阅事件
    定义一个事件处理程序方法,其签名与该事件的委托签名匹配。例如,如果事件基于 EventHandler 委托类型,则下面的代码表示方法存根:  复制代码 
      void HandleCustomEvent(object sender, CustomEventArgs a)
      {
         // Do something useful here.
      }
     使用加法赋值运算符 (+=) 来为事件附加事件处理程序。在下面的示例中,假设名为 publisher 的对象拥有一个名为 RaiseCustomEvent 的事件。请注意,订户类需要引用发行者类才能订阅其事件。  复制代码 
    publisher.RaiseCustomEvent += HandleCustomEvent;
     请注意,前面的语法是 C# 2.0 中的新语法。此语法完全等效于必须使用 new 关键字显式创建封装委托的 C# 1.0 语法:  复制代码 
    publisher.RaiseCustomEvent += new CustomEventHandler(HandleCustomEvent);
     还可以通过使用 lambda 表达式添加事件处理程序:  复制代码 
    public Form1()
    {
        InitializeComponent();
        // Use a lambda expression to define an event handler.
        this.Click += (s,e) => { MessageBox.Show(
           ((MouseEventArgs)e).Location.ToString());};
    }
     有关更多信息,请参见如何:在 LINQ 外部使用 Lambda 表达式(C# 编程指南)。
    使用匿名方法订阅事件
    使用加法赋值运算符 (+=) 来为事件附加匿名方法。在下面的示例中,假设名为 publisher 的对象拥有一个名为 RaiseCustomEvent 的事件,并且还定义了一个 CustomEventArgs 类以承载某些类型的专用事件信息。请注意,订户类需要引用 publisher 才能订阅其事件。  复制代码 
      publisher.RaiseCustomEvent += delegate(object o, CustomEventArgs e)
      {
        string s = o.ToString() + " " + e.ToString();
        Console.WriteLine(s);
      };
     请务必注意,如果使用匿名方法订阅事件,事件的取消订阅过程将比较麻烦。此时要取消订阅,请返回到该事件的订阅代码,将该匿名方法存储在委托变量中,然后将委托添加到该事件中。
      

  2.   

    前面的语法是 C# 2.0 中的新语法。此语法完全等效于必须使用 new 关键字显式创建封装委托的 C# 1.0 语法:
      

  3.   

    呵呵,说是类型转换可能有一些容易误解。但是可以说是一种由编译器自动执行的一个转换过程应该更好理解一些。
    比如:
    button1.OnClick += new EventHandler( this.buttonClick ); 跟 
    button1.OnClick += this.buttonClick ; 
    对于onClick来说,它实际需要的是一个EventHandler类型的委托,无论使用哪一种版本的编译器这一点都不变化,下面的那种用法只是由编译器进行了这个工作。举个例子来说:
    int i = 10;
    string s = "abc" + i + "def";
    string s2 = "abc" + 10 + "def";
    这段代码是可以通过编译(C# 3.0)的,只是被编译器转换为类似于:
    string s = "abc"+i.ToString()+"def";
    string s2 = "abc"+10.ToString()+"def";
    的语句罢了。