Pourquoi surcharger true et false au lieu de définir opérateur bool?

J’ai lu des articles sur la surcharge vrai et faux en C #, et je pense comprendre la différence fondamentale entre ceci et la définition d’un opérateur bool. L’exemple que je vois autour de vous ressemble à quelque chose comme:

public static bool operator true(Foo foo) { return (foo.PropA > 0); } public static bool operator false(Foo foo) { return (foo.PropA <= 0); } 

Pour moi, cela revient à dire:

 public static implicit operator bool(Foo foo) { return (foo.PropA > 0); } 

Autant que je sache, la différence est qu’en définissant séparément vrai et faux, vous pouvez avoir un object à la fois vrai et faux, ou non vrai ni faux:

 public static bool operator true(Foo foo) { return true; } public static bool operator false(Foo foo) { return true; } //or public static bool operator true(Foo foo) { return false; } public static bool operator false(Foo foo) { return false; } 

Je suis sûr qu’il y a une raison pour que cela soit autorisé, mais je ne peux tout simplement pas penser à ce que c’est. Pour moi, si vous voulez qu’un object puisse être converti en vrai ou en faux, un seul opérateur bool a le plus de sens.

Quelqu’un peut-il me donner un scénario où il est logique de le faire dans l’autre sens?

Merci

Comme le dit la documentation , la surcharge true et false est destinée à prendre en charge les types de firebase database (nullable) (oui / non, Y / N, 0/1, etc.).

Et bien sûr, vous pouvez les définir de manière incohérente, comme avec n’importe quel opérateur. Il est de votre responsabilité de rendre quelque chose de sensé. Le compilateur ne demande rien d’autre que les deux.

Je ne savais pas que ces opérateurs existaient. Cela signifie que vous pouvez implémenter le paradoxe de l’auto-négation:

 public class ThisClassIsFalse { public static bool operator true(ThisClassIsFalse statement) { return statement ? false : true; } public static bool operator false(ThisClassIsFalse statement) { return statement ? true : false; } } 

Nous connaissons donc maintenant la vraie solution à ce paradoxe classique… StackOverflowException.

Selon le système, true peut être une valeur autre que zéro. Dans d’autres, cela peut être n’importe quelle valeur positive.

D’autres systèmes ne sont pas vraiment booléens et autorisent un troisième état nul ou nul pour les valeurs booléennes. C’est pourquoi vous pouvez surcharger true et false plutôt que de surcharger un seul opérateur bool.

J’ai déjà vu des personnes surcharger les true et les false surcharges afin de faire des choses intelligentes, telles que la construction d’expressions dans .NET 2.0, avant que Linq n’existe.

Ayende a élaboré une syntaxe comme celle-ci pour créer des requêtes de critères NHibernate, en utilisant son projet NHQG:

 return Repository.FindAll( (Where.Publisher.Name == name) && (Where.Publisher.City == city));