Подтвердить что ты не робот

Разве это не Func <T, bool> и Predicate <T> то же самое после компиляции?

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

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

4b9b3361

Ответ 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, что не означает, что они являются " тип.