2012-03-17 2 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 
    } 

내가 직접 익명 메소드를 할당 할 수있는 경우 (이는 대리인), 왜 대리인 변수? 나는이 세 가지 방법의 차이점을 이해하려고 노력하고 있으며 왜 세 번째 방법을 쓸 수 없습니까?

답변

0

이 대리자를 정의 할 필요가 없습니다 :

delegate void ListChanged(object lst, ListChangedEventArgs args); 

당신은 단순히 System.ComponentModel namesapce에서 이미 정의 위임 (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을 참조하십시오.

관련 문제