2008-08-28 6 views
20

N'a pas tiré au réflecteur pour regarder la différence, mais peut-on attendre de voir exactement le même code compilé lorsque l'on compare Func<T, bool> vs Predicate<T>N'est-ce pas Func <T, bool> et de prédicat <T> la même chose après la compilation?

J'imagine qu'il n'y a pas de différence à la fois prendre un paramètre générique et retour bool ?

+0

@Sean - la différence réside dans l'intention de communiquer. Lorsque j'utilise un prédicat, je veux utiliser le bloc de code comme un «test» et prendre des mesures en fonction du résultat du test. Quand j'utilise un 'Func ', j'ai juste besoin de mandater une fonction qui prend un paramètre et renvoie un booléen. – Gishu

+0

duplication possible de [Pourquoi Func au lieu de prédicat ?] (Http://stackoverflow.com/questions/665494/why-funct-bool-instead-of-predicatet) – abatishchev

Répondre

17

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

16

Robert S. est complètement correct; 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"); 
    } 
} 
+0

Bonne façon de montrer la différence par l'exemple – RichardOD

2

Le plus flexible famille Func ne sont arrivés dans .NET 3.5, donc il types fonctionnellement en double qui devaient être inclus plus tôt de la nécessité.

(plus le nom Predicate communique l'usage prévu aux lecteurs du code source)

0

Même sans médicaments génériques, vous pouvez avoir différents types de délégués qui sont identiques dans les signatures et retourne des types. 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 également les mêmes que Predicate<string> et Func<string, bool>). Mais comme j'ai essayé d'indiquer, le "sens" des deux est différent.

Ceci est un peu comme si je fais deux classes, class Car { string Color; decimal Price; } et class Person { string FullName; decimal BodyMassIndex; }, puis seulement parce que les deux d'entre eux détiennent un string et un decimal, cela ne signifie pas qu'ils sont du type « même ».

Questions connexes