Func<T, bool> e Predicate<T> não são a mesma coisa após a compilação?
Pergunta
Não acionei o refletor para ver a diferença, mas seria de esperar ver exatamente o mesmo código compilado ao comparar Func<T, bool>
vs. Predicate<T>
Eu imagino que não há diferença, pois ambos pegam um parâmetro genérico e retornam bool?
Solução
Eles compartilham a mesma assinatura, mas ainda são de tipos diferentes.
Outras dicas
Roberto S.está completamente correto;por exemplo:-
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");
}
}
Quanto mais flexível Func
family só chegou no .NET 3.5, portanto duplicará funcionalmente os tipos que tiveram que ser incluídos anteriormente por necessidade.
(Além do nome Predicate
comunica o uso pretendido aos leitores do código-fonte)
Mesmo sem genéricos, você pode ter diferentes tipos de delegados idênticos em assinaturas e tipos de retorno.Por exemplo:
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);
}
No exemplo acima, os dois tipos não genéricos têm a mesma assinatura e tipo de retorno.(E na verdade também o mesmo que Predicate<string>
e Func<string, bool>
).Mas como tentei indicar, o “significado” dos dois é diferente.
É como se eu fizesse duas aulas, class Car { string Color; decimal Price; }
e class Person { string FullName; decimal BodyMassIndex; }
, então só porque ambos possuem um string
e um decimal
, isso não significa que sejam do "mesmo" tipo.