2009-12-22 14 views
2

다음과 같은 두 코드의 차이점은 무엇입니까?대리자를 매개 변수로 사용

Invoke(new Action(Foo)); 

Invoke(Foo); 

그리고 허용되는 두 번째 줄은?

감사

+0

예제를 좀 더 형식화하는 것이 좋습니다. 아무 잘못도 없습니다. 명확성을 위해서. 질문이 명확하고 잘 자세를 취하면 사람들은 대답을 더 많이하는 경향이 있음을 기억하십시오. 뷰티도 도움이됩니다 (서식 지정 등). – lorenzog

+0

수정 : 첫 번째 메서드는 다음과 같이 수정해야합니다. void Invoke (작업 메서드) 이제 두 줄이 모두 컴파일되지만 그 차이점은 무엇입니까? 감사합니다. – Exulted

답변

2

서명은 "Invoke (Delegate method)"(대문자 'D')입니다. 그렇지 않습니까?

작업을 구성하는 첫 번째 행만 명시 적으로 작동합니다.

이유 : 위임은 모든 대리인의 기본 클래스입니다. 이것은 알 수없는 반환 값과 알 수없는 숫자 및 유형의 매개 변수가있는 대리자를 나타냅니다. DynamicInvoke를 통해서만 호출 할 수 있습니다.

컴파일러에서는 메서드 이름 만 전달할 때 사용할 실제 대리자 유형을 "Invoke (Foo);"로 알지 못합니다. 액션 일 수도 있지만 푸 (Foo)와 같은 서명을 가진 또 다른 위임자 일 수도 있습니다.

그러나 명시 적으로 대리인을 만들면 대리자으로 암시 적으로 변환 될 수 있으므로 코드가 컴파일됩니다.

+0

맞습니다. 정확히 입력 해 보았습니다. 'Delegate'가되는 것을 어떻게 알았는지 설명 할 가치가 있다고 생각합니까? –

+0

음, 메서드의 매개 변수 목록에서 "Delegate"대신 "Delegate"를 사용하면 "Delegate"가 대리자 및 익명 메서드를 정의하는 특수 키워드이므로 5 개의 컴파일러 오류가 발생합니다. – Matthias

+0

마지막 편집 후 (서명이 "void Invoke (Action method)") Maximilian Mayerl이 맞습니다. – Matthias

3

왜 사용해 보지 않으시겠습니까? 당신의 방법의 서명이

void Invoke(Action objAction) 

인 경우

는 그것은 합법적이다. 그리고 두 번의 호출은 같습니다. 이 기능을 "암시 적 메서드 그룹 변환"이라고합니다.

관련 문제