2013-03-28 2 views
4

가정

지정 확장 메서드 삼항 문

의 우리가 인터페이스를 가지고 있고, 정의는 다음 확장 메서드는 인터페이스 말했다 가정하자 ( 자신의 구현이 중요하지)

public interface IPerson; 

public class IPersonExtensionMethods 
{ 
    public static bool SayHello(this IPerson talker, IPerson listener); 
    public static bool SayGoodbye(this IPerson talker, IPerson listener); 
} 

문제

두 확장 방법 모두 IPerson의 매개 변수를 두 개 허용하고 bool을 반환한다는 점에서 근본적으로 같습니다. 다음과 같이 우리가 속기로 if 문을 설정하는 경우에는

Func<IPerson, IPerson, bool> whatShouldWeSay; 
if (sayHello) 
{ 
    whatShouldWeSay = IPersonExtensionMethods.SayHello; 
} 
else 
{ 
    whatShouldWeSay = IPersonExtensionMethods.SayGoodbye; 
} 

: 지금, 우리는 우리가 사용할 수있는 유형 Func<IPerson, IPerson, bool>의 대리자로 확장 방법 중 하나를 할당 할 가정하자

Func<IPerson, IPerson, bool> whatShouldWeSay = (sayHello) 
    ? IPersonExtensionMethods.SayHello 
    : IPersonExtensionMethods.SayGoodbye; 

Type of conditional expression cannot be determined because there is no implicit conversion between 'method.group' and 'method.group'

질문

,369 : 우리는 컴파일 오류 메시지가

이 오류가 발생하는 이유는 무엇입니까? 델리게이트가 확장 메서드라는 특성 때문입니다. 또는 그 결과가 short-hand if 진술에 어떻게 결정 되었는가? 아니면 완전히 다른 무엇입니까?

답변

2

오류가 발생하는 이유는 3 진 문에서 두 결과 (true 및 false)가 동일한 유형이어야하기 때문입니다. 이 같은 일은 확장 메서드뿐만 아니라 일반적인 메서드에서도 발생합니다. 당신은 목표 유형에 캐스팅해야합니다 원계 문에서 null을 사용할 때이 비트를 경험했던

Func<IPerson, IPerson, bool> whatShouldWeSay = (sayHello) 
    ? (Func<IPerson, IPerson, bool>)IPersonExtensionMethods.SayHello 
    : (Func<IPerson, IPerson, bool>)IPersonExtensionMethods.SayGoodbye; 

, 그것은 일부 nullable 형식으로 null 캐스트를 보는 것은 매우 이상한 느낌. 우리는 다음과 같은 컴파일러 오류 얻을

// Doesn't compile 
int? a = true ? 10 : null; 

// Compiles 
int? a = true ? 10 : (int?)null; 

: 혼란 낳는다 경우, 두 결과가 동일한 답변 @Tyriar에 대한

Type of conditional expression cannot be determined because there is no implicit conversion between 'int' and '<null>'

+0

감사합니다, 그러나 이것은이 여기에 간단한 방법으로 표시 할 수 있습니다 , 캐스트에 상관없이, 틀림없이? – Richard

+0

그들은 똑같은가요? 두 개의 다른 * 메소드를 반환하고 있습니다. 할당 후에는 동일한 'Func' 유형으로 묶입니다. 흥미롭게도 –

+0

; 두 번째 결과 인 'SayGoodbye'만 전송하면 컴파일됩니다. 캐스팅 한 사람이 후자를 정의할까요, 아니면이 경우에는 이전을 정의할까요? – Richard