parameter how examples ejemplo c# .net predicate func

c# - how - ¿Func<T, bool> y Predicate<T> no son lo mismo después de la compilación?



how to use func c# (4)

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

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.


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


La familia Func más flexible solo llegó a .NET 3.5, por lo que duplicará funcionalmente los tipos que se tuvieron que incluir antes por necesidad.

(Además, el nombre Predicate comunica el uso previsto a los lectores del código fuente)


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.