2011-12-01 2 views
4

저는 Linq 구문과 그 기능이 마음에 들지만, 가끔씩 일이 어떻게 작동 하는지를 이해하지 못하는 경우가 있습니다.람다 식을 메서드 그룹으로 바꿀 때 컴파일러 오류가 발생했습니다.

지금 당장. 'regex.IsMatch'당신이 첫 번째 쿼리에서 볼 수 있듯이

Regex regex = new Regex(...); 

int result1 = stringList.Count(regex.IsMatch); 
IEnumerable<string> result2 = stringList.Where (x => regex.IsMatch (x)); 

내가 짧은 방법 그룹을 사용할 수 있지만, 두 번째 쿼리에 나는 'X => 정규식을 작성해야 : 나는 다음과 같은 코드 조각이 .IsMatch (x) '.

카운트 두 유형의 같은 인수를 어디에서 컴파일러 오류가 왜이 수행 할 때

Func<string, bool> 

내가 볼 수 없기 때문에

: 기본적으로

IEnumerable<string> result2 = stringList.Where (regex.IsMatch); 

답변

5

를, 이것은이다 과부하 해결 문제.

Count에는 두 개의 인수 (확장 인수 + 조건 자)를 사용하는 오버로드가 하나만 있지만 Where에는 두 개가 있습니다 (조건부가 항목 인덱스를 고려하는 경우와 그렇지 않은 경우). 문제를 복잡하게하기 위해 Regex.IsMatch에는 자체적으로 여러 오버로드가 있습니다. 가 지금은 컴파일러가 IsMatch는 (각자가 Where의 다른 과부하와 호환) 진정으로 적용 할 수있는 이러한 과부하의 때문에 모호함에 대해 불평하는 정확하다는 것을 밝혀 ...

// Where overload without item-index 
Regex.IsMatch(string) is compatible with Where<string>(string, Func<string, bool>) 

// Where overload with item-index 
Regex.IsMatch(string, int) is compatible with Where<string>(string, Func<string, int, bool>) 

하지만, (반환 유형 분석이 필요한 경우) compiler can complain about ambiguity even when there is no ambiguity for a human이있는 방법 그룹과 관련된 다른 관련 사례가있을 수 있습니다.

+0

고마워요, 지금 완전히 이해가됩니다 :) –

관련 문제