2015-01-08 5 views
2

나는이 질문 diference between delegate and action대표는, 액션 위임 매개 변수로 전달 람다 식

하지만 난 람다를 통과 할 수있는 반면 행동 유형 매개 변수
을 받아 들일 방법에 람다 식을 전달할 수있는 이유를 나는 아직도 궁금에서 살펴 나는이 인쇄 방법을
위임 유형 매개 변수를 허용 방법과 표현, 난 당신이 F를 볼 수 인쇄 메소드를 호출 이러한 두 가지 방법을 만들어

public static void Print() 
{ 
    Console.WriteLine("Printing .."); 
} 

행동과 위임을 사용하여 참조합니다 IRST 행동 유형 매개 변수를 가지고 있으며, 두 번째는 이러한 매개 변수 내가 이러한 방법에 람다 식을 전달합니다

public static void ActionParamMethod(Action DAction) 
{ 
    DAction(); 
} 
public static void DelegateParamMethod(Delegate SomeDelegate) 
{ 

} 

방법 "인쇄"를 참조 할 대리자 형식 매개 변수가

public static void SomeHowMethod() 
{ 
    DelegateParamMethod(() => Print()); 
    ActionParamMethod(() => Print()); 
} 

내가 통과하려고 위임 매개 변수를 허용하는 방법에 람다 표현식이 오류를 얻을 'System.Delegate'을 입력 람다 식을 변환 할 수 없습니다


이 01 때문에은 델리게이트 형식이 아닙니다.

이유는 위임 유형이 아니며 작업은 위임 유형입니까?
Action 매개 변수를 허용하는 메서드에 람다 식을 전달할 수 있지만 대리 매개 변수를 수락하는 메서드에 람다 식을 전달할 수없는 이유는 무엇입니까?

답변

4

람다는 컨텍스트를 기반으로 사용되는 대리인의 실제 유형을 유추해야합니다. Delegate이 예상되는 컨텍스트에서 람다를 사용하려고 시도 할 때 람다 추론 알고리즘은 어떤 특정 유형의 델리게이트를 결정할 수 없습니다. 이것은 인터페이스의 인스턴스를 만들려는 것과 같습니다. 어떤 구현을 선택해야할지 알 수 없습니다.

1

문제는 호출 할 대리자 형식을 제공하지 않는다는 것입니다. 당신은 같은 뭔가를 찾고있다 : 당신은 당신의 코드에서 Delegate를 참조하지 않아야

DelegateParamMethod((Action)(() => Print())); 
0

,이 대표의 기본 클래스입니다하지만 당신은 여기에서하고있는 것처럼 사용하는 것이 아닙니다.

대신 위임자 유형 (예 : Action 예)을 선택하고 매개 변수로 사용해야합니다.

+1

'Delegate'를주의해서 사용해야하지만, 사용법은 분명합니다. 서명에 관계없이 모든 대리인을 수락 할 수 있기를 정말로 원한다면 사용하는 데 필요한 것입니다. 그것의 적절한 사용은 확실히 희소하다, 그러나 그들은 존재한다. 또한 이것이 실제로 질문에 대답하지 않는다는 점에 유의하십시오. 기껏해야 의견이어야합니다. – Servy

+0

양식 및 컨트롤에는 BeginInvoke와 같은 많은 방법으로 대리인이 많이 사용되지만 솔직히 왜 사용되는지는 알 수 없습니다. –

+1

@Servy : 나는 이런 점을 명확히 할 때 절대적으로 선호합니다. '보통'으로 모든 것을 페퍼 링하는 것은 요점을 모호하게 만드는 경향이 있습니다. 델리게이트와 델리게이트의 차이점을 이해하지 못한다면, "후자를 절대 사용하지 마십시오"라고 말하는 것이 안전합니다. 필요할 때가 오기까지 오랜 시간이 걸릴 것입니다. – Guvante

3

람다 식은 구체적인 유형으로 캐스팅하지 않는 한 C#에 유형이 없습니다.

Delegate type은 모든 대표자의 기본 클래스입니다. abstract 클래스입니다. Action 또는 Func과 같은 실제 대리자 형식을 지정하지 않으면 람다 식을 Delegate으로 전달할 수 없습니다. 마치 추상적 인 클래스를 인스턴스화 할 수없는 것처럼 당신을 구현하는 클래스를 매개 변수로 전달할 수 있습니다.당신이 어떤 대리자 형식에 람다 캐스팅 경우 예상대로 작동합니다

DelegateParamMethod((Action<string>)(x => Console.WriteLine(x)); 

첫 번째 방법은식이 Action로 변환 할 수 있기 때문에 유형이 지정하지 않고 작동하는 이유는, 그렇지 않으면 유효하지 않을 것이다 이 표현식이 유효하지 않은 이유는 다음과 같습니다 :

var x =() => Print("Hello world"); 
+0

의미 람다 식은 암시 적으로 작업으로 변환 될 수 있지만 암시 적으로 대리인으로 변환 될 수 없으며 Delegate 유형의 매개 변수 인 경우 명시 적으로 작업 유형으로 캐스팅해야합니까? –