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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top