2011-04-28 5 views
9

안녕
나는 일반적이고 널 (NULL) 사용하여이 코드를 가지고 :일반 유형 매개 변수 및 Null 허용 메서드 오버로드

// The first one is for class 
public static TResult With<TInput, TResult>(this TInput o, 
      Func<TInput, TResult> evaluator) 
    where TResult : class 
    where TInput : class 

// The second one is for struct (Nullable) 
public static TResult With<TInput, TResult>(this Nullable<TInput> o, 
      Func<TInput, TResult> evaluator) 
    where TResult : class 
    where TInput : struct 

가 TInput 제약을 유의하시기 바랍니다, 하나의 클래스, 다른 하나는 구조체이다. 그런 다음 사용합니다 :

string s; 
int? i; 

// ... 

s.With(o => ""); 
i.With(o => ""); // Ambiguos method 

Ambiguos 오류가 발생합니다. 그러나 나는 또한 다른 쌍을 가지고 :

public static TResult Return<TInput, TResult>(this TInput o, 
      Func<TInput, TResult> evaluator, TResult failureValue) 
    where TInput : class 

public static TResult Return<TInput, TResult>(this Nullable<TInput> o, 
      Func<TInput, TResult> evaluator, TResult failureValue) 
    where TInput : struct 

이 하나가 성공적으로 컴파일 이런 일이 왜

string s; 
int? i; 

// ... 

s.Return(o => 1, 0); 
i.Return(o => i + 1, 0); 

나는 어떤 단서도 없어. 첫 번째는 좋아 보이지만 오류는 컴파일됩니다. 두 번째 것 ('Return')은 첫 번째 것이고 성공적으로 컴파일되면 오류가 발생합니다. 내가 뭐 놓친 거 없니? 일반 메소드 내

+0

스타일 주석처럼 이미 범위에있는 변수와 동일한 이름을 람다 매개 변수에 사용하지 않아야합니다. –

+0

아아 오른쪽, 실제로 컴파일 오류가 발생합니다. 나는 단지 코드를 급하게 붙여 넣고 편집한다. –

답변

10

제약은 가 과부하을 선택하는 동안 간주되지 않습니다 - 그들은 과부하가 선정되었습니다 후 을 확인하고 있습니다.

의 유형 내 제약은으로 과부하 선택의 일부로 검사됩니다. 조금 혼란 스럽지만 결국 이해가됩니다.

여기에 blog post이 있으니 추가로 이해할 수 있습니다.

또한 두 번째 예제에는 유형 추론에 기여하는 추가 인수가 있는데 두 가지의 차이점이 있습니다. TResult 유효한되는 것을 제 과부하 방지 int 인 것으로 추정된다 - (int x) => x + 1Func<int, int>- 전환이있는 반면 (int? x) => x + 1Func<int?, int>에서 아무런 변환도 없다.

+0

나는 지금 당장 귀찮게 생각하고, 나는 마지막 단락을 이해하려고 노력하고있다. Func <> 대리자는 모두 nullable (int?)을 전혀 사용하지 않습니다. 첫 번째 매개 변수 만 있습니다. –

+0

@Hendry : 각각의 경우에 첫 번째 오버로드는'int? '에서 호출하기 때문에'TInput = int?'를 처리 할 것입니다. 그러므로'evaluator' 매개 변수 유형은'Func '입니다. –

+0

오, 저것은 lambda 함수에 기반한 과부하 해결이 첫 번째 'Return'에서 실패하고 두 번째 것으로 넘어지는 이유입니다. 정말 고마워. –