Разве это не Func <T, bool> и Predicate <T> то же самое после компиляции?
Не заработайте рефлектор, чтобы посмотреть на разницу, но ожидаете увидеть тот же скомпилированный код при сравнении Func<T, bool> vs. Predicate<T>
Я бы предположил, что нет никакой разницы, поскольку оба берут общий параметр и возвращают bool?
Ответ 1
Они имеют одну и ту же подпись, но все еще разные типы.
Ответ 2
Роберт С. совершенно прав; например: -
class A {
static void Main() {
Func<int, bool> func = i => i > 100;
Predicate<int> pred = i => i > 100;
Test<int>(pred, 150);
Test<int>(func, 150); // Error
}
static void Test<T>(Predicate<T> pred, T val) {
Console.WriteLine(pred(val) ? "true" : "false");
}
}
Ответ 3
Более гибкое семейство Func появилось только в .NET 3.5, поэтому оно будет функционально дублировать типы, которые должны были быть включены ранее по необходимости.
(Плюс название Predicate связывает предполагаемое использование с читателями исходного кода)
Ответ 4
Даже без дженериков вы можете иметь разные типы делегатов, которые идентичны в типах подписей и возвратов. Например:
namespace N
{
// Represents a method that takes in a string and checks to see
// if this string has some predicate (i.e. meets some criteria)
// or not.
internal delegate bool StringPredicate(string stringToTest);
// Represents a method that takes in a string representing a
// yes/no or true/false value and returns the boolean value which
// corresponds to this string
internal delegate bool BooleanParser(string stringToConvert);
}
В приведенном выше примере два не общих типа имеют одинаковый тип подписи и возврата. (И на самом деле то же самое, что и Predicate<string> и Func<string, bool>). Но, как я пытался указать, "смысл" этих двух разных.
Это похоже на то, что если я делаю два класса, class Car { string Color; decimal Price; } и class Person { string FullName; decimal BodyMassIndex; }, то только потому, что оба они содержат string и a decimal, что не означает, что они являются " тип.