10
votes

Comment l'opérateur surcharge-t-il du travail vrai et faux?

Vous pouvez surcharger l'opérateur True et FALSE, j'ai regardé des exemples et j'ai trouvé ce http://msdn.microsoft.com/en-us/library/aa691312%28v=vs.71%29.aspx

Je ne comprends pas comment ils fonctionnent. Je sais si j'écris si (obj) et VRAI retournent true alors le si est exécuté. Cela ne comporte pas ce que les faux retours. Cependant, comment fonctionne le faux travail? Dans cette doc, il est suggéré que l'opérateur && l'utilise. J'ai écrit le code ci-dessous. Je ne sais pas comment obtenir && de compiler. || me donne aussi une erreur de compilation. Comment puis-je être appelé faux? et comment puis-je obtenir les && et || travailler? xxx


4 commentaires

Qu'essayez-vous de faire? Qu'est-ce que cela signifie pour une période de retard d'être vrai ou faux?


@Mark: Je jouais avec l'opérateur + dans ma dernière question / exemple qui m'a conduit à cela et j'ai utilisé la même classe. Le nom est un mannequin, j'apprends simplement comment fonctionne les OPS.


Vous n'avez pas déclaré des opérateurs pour & ou | - En examinant le lien de documentation que vous avez fourni indique que vous devez déclarer ces opérateurs, ils doivent renvoyer des objets myTimesPan et vous devez déclarer des opérateurs pour vrai et faux. La documentation explique également dans les cas où des opérateurs vrais et faux sont utilisés.


@James: Pour une raison quelconque, je pensais et comme si la gauche et le côté droit est à la fois vraie et ne voyait pas comment le logique et le concerne. Maintenant, je vois que cela fait un et entre les deux ops et les chèques s'il est vrai. Qui est bizarre pour moi. Cause 1 && 2 est illégale en C # et en C ++, il est vrai car il n'y a pas d'application logique et appliquée codépad.org/9icaqzq2 < / a>


3 Réponses :


23
votes

La propriété de définition d'un opérateur de court-circuit est qu'il n'a pas besoin d'évaluer le côté droit si le côté gauche détermine déjà le résultat. Pour ou si le côté gauche est true le résultat sera vrai dans tous les cas et il est inutile d'évaluer le côté droit. Pour et c'est la même chose, sauf que si le côté gauche est false le résultat sera faux.

Vous devez surcharger les deux | et true pour obtenir || . Et & et false pour obtenir && .

a || b correspond à quelque chose comme op_true (a)? A: (A | B) . Donc, si le véritable opérateur revient vrai, il n'a pas besoin d'évaluer l'expression de b.

a && b correspond à quelque chose comme op_false (a)? A: (A & B) . Donc, si le faux opérateur revient vrai, il n'a pas besoin d'évaluer l'expression de b.

Surcharge des opérateurs de court-circuit est utile lors de la création d'un type booléen personnalisé, tel que Nullable Bools (voir dbbool )



1
votes

Vous aurez besoin de remplacer & opérateur pour && et | ou ||.

quelque chose comme ceci: (juste un code factice) xxx


0 commentaires

8
votes

Lorsque vous surchargez le true code> et false code> Les opérateurs, ils ne retiennent pas simplement true code> et false code>, ils sont Utilisé pour déterminer si une valeur de votre type est considérée comme vraie ou false.

Si, par exemple, une valeur zéro dans votre classe représente FALSE, une valeur non nulle représente TRUE: P>

public static bool operator true(MyTimeSpan t) { return t.Value != 0; }
public static bool operator false(MyTimeSpan t) { return t.Value == 0; }


5 commentaires

+1. Voir aussi commentaire que j'ai laissé dans ma question ou le même commentaire sur cette réponse Stackoverflow.com/Questtions/5203093/...


Vous n'avez pas besoin de répondre à celui-ci mais j'ai fait mon commentaire dans une question Stackoverflow.com/Questtions/5203498/...


Si X est un type arbitraire qui remplace les opérateurs, mais on ne sait rien d'autre à ce sujet, existe-t-il un moyen de déterminer si x est "faux" (par opposition à ne pas être simplement "vrai")?


@supercat: Je ne suis pas sûr. J'ai essayé de différentes manières de le tester, mais je n'ai pas trouvé de moyen d'utiliser l'opérateur faux sans surcharger l'opérateur & .


@Guffa: c'est trop mauvais si utilise l'opérateur true plutôt que de tenter une extinction implicite à bool ou d'avoir une syntaxe spécifiquement pour utiliser le < code> true et false opérateurs [par exemple Si true (threestateConditionnemental) {codeIftRue} else si faux {codeiffalse} else {codeIfneNe} ele {codeIfne} ] Le fait qu'un type prend en charge les opérateurs court-circuités ne signifie pas nécessairement qu'il doit être directement utilisable comme une condition.