Я пытаюсь скомпилировать следующий код в С#:
public static T FirstEffective(IEnumerable<T> list)
{
Predicate<T> pred = x => x != null;
return Enumerable.FirstOrDefault(list, pred);
}
В компиляторе (Mono/.NET 4.0) появляется следующая ошибка:
File.cs(139,47) The best overloaded method match for `System.Linq.Enumerable.FirstOrDefault<T>(this System.Collections.Generic.IEnumerable<T>,System.Func<T,bool>)' has some invalid arguments
/usr/lib/mono/4.0/System.Core.dll (Location of the symbol related to previous error)
File.cs(139,47): error CS1503: Argument `#2' cannot convert `System.Predicate<T>' expression to type `System.Func<T,bool>'
Это довольно странно, так как Predicate<T>
на самом деле является функцией, которая принимает в качестве входного параметра параметр T
и возвращает a bool
(T
является четным "ковариантным", поэтому разрешена специализация T
). Не учитывают ли делегаты "принцип замещения Лискова", чтобы получить, что Predicate<T>
эквивалентно Func<T,bool>
? Насколько я знаю, эта проблема эквивалентности должна быть разрешимой.