parameter - predicate c#




¿Func<T, bool> y Predicate<T> no son lo mismo después de la compilación? (3)

No se ha disparado el reflector para ver la diferencia, pero uno esperaría ver el mismo código compilado exactamente al comparar Func<T, bool> vs. Predicate<T>

Me imagino que no hay diferencia ya que ambos toman un parámetro genérico y devuelven bool.


Comparten la misma firma, pero siguen siendo de diferentes tipos.


Robert S. es completamente correcto; por ejemplo:-

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");
  }
}

Incluso sin genéricos, puede tener diferentes tipos de delegados que son idénticos en firmas y tipos de devolución. Por ejemplo:

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);
}

En el ejemplo anterior, los dos tipos no genéricos tienen la misma firma y el mismo tipo de devolución. (Y en realidad también lo mismo que Predicate<string> y Func<string, bool> ). Pero como traté de indicar, el "significado" de los dos es diferente.

Esto es algo así como si hago dos clases, class Car { string Color; decimal Price; } class Car { string Color; decimal Price; } class Car { string Color; decimal Price; } y class Person { string FullName; decimal BodyMassIndex; } class Person { string FullName; decimal BodyMassIndex; } class Person { string FullName; decimal BodyMassIndex; } , entonces simplemente porque ambos tienen una string y un decimal , eso no significa que sean del mismo tipo.





func