Позвольте мне привести свой собственный пример, поскольку у меня тоже была та же проблема (с надеждой, что этот пример будет полезен для других):
Мой Find
метод является универсальным методом, который получает Expression<Func<T, bool>>
в качестве предиката и дает List<T>
в качестве вывода.
Я хотел найти страны, но мне нужны все, если список языков был пуст, и отфильтрованный список, если список языков был заполнен.
Сначала я использовал код, как показано ниже:
var countries=
Find(languages.Any()
? (country => languages.Contains(country.Language))
: (country => true));
Но именно я получаю ошибку: there is no implicit conversion between lambda expression and lambda expression.
Проблема заключалась в том, что у нас есть только два лямбда-выражения, и ничего больше, например, что такое country => true
точно ?? Мы должны определить тип хотя бы одного из лямбда-выражений . Если будет определено только одно из выражений, ошибка будет пропущена. Но чтобы сделать код более читабельным, я извлек оба лямбда-выражения и вместо этого использовал переменную, как показано ниже:
Expression<Func<Country, bool>> getAllPredicate = country => true;
Expression<Func<Country, bool>> getCountriesByLanguagePredicate = country => languages.Contains(country.Language);
var countries= Find(languages.Any()
? getCountriesByLanguagePredicate
: getAllPredicate);
Подчеркну, что, если я просто определю один из типов выражения, ошибка будет исправлена.