Func<T, bool> et Predicate<T> ne sont-ils pas la même chose après la compilation ?

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

  •  09-06-2019
  •  | 
  •  

Question

Je n'ai pas lancé Reflector pour voir la différence, mais s'attendrait-on à voir exactement le même code compilé lors de la comparaison Func<T, bool> contre. Predicate<T>

J'imagine qu'il n'y a aucune différence car les deux prennent un paramètre générique et renvoient un booléen ?

Était-ce utile?

La solution

Ils partagent la même signature, mais ce sont toujours des types différents.

Autres conseils

Robert S.est tout à fait exact ;Par exemple:-

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

Le plus flexible Func La famille n'est arrivée que dans .NET 3.5, elle dupliquera donc fonctionnellement les types qui devaient être inclus plus tôt par nécessité.

(Plus le nom Predicate communique l'utilisation prévue aux lecteurs du code source)

Même sans génériques, vous pouvez avoir différents types de délégués identiques en termes de signatures et de types de retour.Par exemple:

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

Dans l'exemple ci-dessus, les deux types non génériques ont la même signature et le même type de retour.(Et en fait aussi la même chose que Predicate<string> et Func<string, bool>).Mais comme j’ai essayé de l’indiquer, le « sens » des deux est différent.

C'est un peu comme si je faisais deux cours, class Car { string Color; decimal Price; } et class Person { string FullName; decimal BodyMassIndex; }, alors juste parce qu'ils détiennent tous les deux un string et un decimal, cela ne veut pas dire qu'ils sont du "même" type.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top