Разве Func <T, bool> и Predicate <T>- это одно и то же после компиляции? - PullRequest
21 голосов
/ 28 августа 2008

Не включал рефлектор, чтобы увидеть разницу, но можно было бы ожидать увидеть тот же скомпилированный код при сравнении Func<T, bool> с Predicate<T>

Я полагаю, что нет никакой разницы, так как оба принимают универсальный параметр и возвращают bool?

Ответы [ 4 ]

18 голосов
/ 28 августа 2008

Они имеют одну и ту же сигнатуру, но они все еще разных типов.

17 голосов
/ 31 августа 2008

Роберт С. полностью прав; например: -

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");
  }
}
2 голосов
/ 14 ноября 2009

Более гибкое семейство Func появилось только в .NET 3.5, поэтому оно будет функционально дублировать типы, которые должны были быть включены ранее из-за необходимости.

(плюс имя Predicate сообщает о предполагаемом использовании читателям исходного кода)

0 голосов
/ 24 февраля 2013

Даже без обобщений вы можете иметь разные типы делегатов, которые идентичны в сигнатурах и типах возвращаемых данных. Например:

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, это не означает, что они "одинаковые" тип.

...