Разве функция<T, bool=""> и предикат<T> не одно и то же после компиляции?
Вопрос
Я не запускал reflector, чтобы посмотреть на разницу, но можно ли ожидать увидеть точно такой же скомпилированный код при сравнении Func<T, bool>
против. Predicate<T>
Я бы предположил, что нет никакой разницы, поскольку оба принимают общий параметр и возвращают bool?
Решение
У них одна и та же подпись, но они по-прежнему разных типов.
Другие советы
Роберт С.является полностью правильным;например:-
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");
}
}
Чем более гибким Func
семейство появилось только в .NET 3.5, поэтому оно будет функционально дублировать типы, которые должны были быть включены ранее по необходимости.
(Плюс название Predicate
информирует читателей о предполагаемом использовании исходного кода)
Даже без обобщений у вас могут быть разные типы делегатов, идентичные по сигнатурам и возвращаемым типам.Например:
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
и еще decimal
, это не значит, что они "одного" типа.