2012-03-17 5 views
0

細かい次の仕事の両方:デリゲート変数を割り当ててイベントハンドラを登録できないのはなぜですか?

BindingList<Employee> lstEmployees = new BindingList<Employee>(); 

    //delegate pointing to an anonymous method 
    //---------------------------------------- 
    delegate void ListChanged(object lst, ListChangedEventArgs args); 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     listBox1.ValueMember = "Empno"; 
     listBox1.DisplayMember = "Ename"; 
     listBox1.DataSource = lstEmployees; 

     ListChanged lstchanged = delegate(object lst, ListChangedEventArgs args) 
     { 
      lblEmpCount.Text = lstEmployees.Count.ToString(); 
     }; 

     lstEmployees.ListChanged += new ListChangedEventHandler(lstchanged); 
    } 

    //Anonymous method (with params) 
    //----------------------------------------------------- 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     listBox1.ValueMember = "Empno"; 
     listBox1.DisplayMember = "Ename"; 
     listBox1.DataSource = lstEmployees; 

     lstEmployees.ListChanged += delegate(object lst, ListChangedEventArgs args) 
     { 
      lblEmpCount.Text = lstEmployees.Count.ToString(); 
     }; 
    } 

ではなく、次

delegate void ListChanged(object lst, ListChangedEventArgs args); 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     listBox1.ValueMember = "Empno"; 
     listBox1.DisplayMember = "Ename"; 
     listBox1.DataSource = lstEmployees; 

     ListChanged lstchanged = delegate(object lst, ListChangedEventArgs args) 
     { 
      lblEmpCount.Text = lstEmployees.Count.ToString(); 
     }; 

     lstEmployees.ListChanged += lstchanged; //error here 
    } 

私は(代理人である)に直接、匿名メソッドを割り当てることができるなら、なぜないデリゲート変数?私は3つの方法の違いを理解しようとしており、なぜ3番目の方法を書くことができないのですか?あなたはこのデリゲートを定義する必要はありません

答えて

0

delegate void ListChanged(object lst, ListChangedEventArgs args); 

あなたは、単にSystem.ComponentModelな名前空間から、すでに定義されてデリゲート(ListChangedEventHandler)を使用することができます

ListChangedEventHandler lstchanged = delegate(object lst, ListChangedEventArgs args) 
{ 
    lblEmpCount.Text = lstEmployees.Count.ToString(); 
}; 

lstEmployees.ListChanged += lstchanged; // no error 

ListChangedイベントはタイプListChangedEventHandlerです。したがって、別のタイプのイベントハンドラを受け入れることは期待できません。あなたのコードでlstchangedが自分のデリゲートタイプ(ListChanged)であるのに対して、タイプがListChangedEventHandlerでなければならないので、次の行は間違っています。

lstEmployees.ListChanged += lstchanged; //error here 

詳細については、this articleを参照してください。

関連する問題