2014-11-07 2 views
1

다른 매개 변수에서 호출하여 추가 정보를 삽입 할 수 있도록 선택적 매개 변수를 button_click 함수에 추가하려고합니다. 여기 button_click 함수에 선택적 매개 변수 추가

코드입니다 :

private void button1_Click(object sender, EventArgs e, string bla = "") 
    { 
     if (bla.Length > 0) 
     { 
      MessageBox.Show(bla); 
     } 
     else 
     { 
      MessageBox.Show("Hi!"); 
     } 
    } 
    private void button1_trigger() 
    { 
     button1_Click(null, null, "hi"); 
    } 

난 비주얼 스튜디오 2012 enter image description here enter image description here

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

답변

4

그것은 당신의 코드가 작동해야처럼 보이지만에서지고있어 오류 (마지막 매개 변수 때문에, 선택 사항입니다 "button1_Click"은 여전히 ​​델리게이트와 일치해야합니다.), C# 컴파일러의 제한으로 인한 것이 아닙니다. 즉, 컴파일러는 메서드에 오버로드가있는 대리자, 또는 선택적 매개 변수가있는 메서드를 일치시킬 수 없습니다. 좋은 이유가 있습니다.이 사례를 정상적으로 처리하는 것이 더 복잡 할 수도 있습니다. 에릭 리 퍼트 (Erric Lippert)는 그의 블로그에서이 주제에 대해 썼습니다.)

두 경우 모두에서 작동하는 다른 함수를 추가하기 만합니다. 당신이 어떤 이유에서 추가 기능을 추가하지 않으려면 다음 핸들러를 추가하는 람다를 사용할 수,

그래서

private void trigger(object sender, EventArgs e, string bla = "") 
{ 
    if (bla.Length > 0) 
    { 
     MessageBox.Show(bla); 
    } 
    else 
    { 
     MessageBox.Show("Hi!"); 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    trigger(sender, e); 
} 

private void button1_trigger() 
{ 
    trigger(null, null, "hi"); 
} 

편집 : 및 핸들러에서 하나를 호출 :

this.button1.Click += (sender, args) => this.button1_Click(sender, args); 

결과 컴파일 된 코드는 실제로 매우 유사합니다 (저는 C# 컴파일러가 익명의 대리자를위한 다른 멤버 함수를 추가 할 것으로 믿습니다). 그러나이 구문은 더욱 간결합니다.

+2

버튼 클릭시'NullReferenceException'을 던집니다. 아니? – Dmitry

+0

이것은 버튼 기능을 트리거하기위한 추가 기능을 만들고 싶지 않은 '더러운'해결책입니다. 답해 주셔서 감사합니다. 메신저는 다른 (덜 부정한) 해결책을 기대합니다. – Ismail

+0

죄송합니다. 감사합니다 ... null 버그가 수정되었습니다. – McGarnagle