Ошибка компилятора при замене лямбда-выражения группой методов - PullRequest
4 голосов
/ 01 декабря 2011

Мне нравится синтаксис Linq и его мощь, но иногда я просто не могу понять, почему вещи работают так, как они работают.

Как сейчас.У меня есть следующий фрагмент кода:

Regex regex = new Regex( ... );

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

Как вы можете видеть в первом запросе, я могу использовать более короткую группу методов 'regex.IsMatch', но во втором запросе я должен написать 'x => regex.IsMatch (x) '.

В качестве количества и где оба принимают один и тот же аргумент типа

Func<string, bool>

Я не понимаю, почему при этом я получаю ошибку компилятора:

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

1 Ответ

5 голосов
/ 01 декабря 2011

По сути, это проблема разрешения перегрузки.

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>)

... но могут быть и другие связанные случаи, связанные с группами методов (когда требуется анализ возвращаемого типа), когда компилятор может жаловаться на неоднозначность, даже если для человека не существует двусмысленности .

...