Разве функция<T, bool=""> и предикат<T> не одно и то же после компиляции?

StackOverflow https://stackoverflow.com/questions/32709

  •  09-06-2019
  •  | 
  •  

Вопрос

Я не запускал 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, это не значит, что они "одного" типа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top