seguito this very interesting issue che è stato originato da this domanda -&& sovraccarico operatore e assegnazioni in C# - Chiarificazione?
voglio prendere 1 passi indietro si prega di (tolto l'ambiente dinamico):
Guardando questo codice: (a variant of this one)
void Main()
{
int a;
int b = 100;
Console.WriteLine(X.M(1, out a));
}
public class X
{
public int H=0;
public static X M(int x, out int y)
{
Console.WriteLine("x = "+x);
y = x;
return new X(x);
}
public X(){}
public X(int h)
{
H=h;
}
public static bool operator false(X x) {Console.WriteLine("in false operator for "+ x.H); return true; }
public static bool operator true(X x) {Console.WriteLine("in true operator for "+ x.H); return true; }
public static X operator &(X a, X b) {Console.WriteLine("in & operator for "+ a.H+","+b.H); return new X(); }
public static implicit operator bool (X x) {Console.WriteLine("in bool operator for "+ x.H);return true; }
}
Il risultato è:
.210Questo è capito:
- Il
x = 1
è dal metodo stesso (utilizzandoConsole.Writeline
) in bool operator for 1
da parte dell'operatore implicita daX
aBool
(così -Console.WriteLine
tratta l'intera espressione comeConsole.Writeline(bool)
)- L'ultimo "Vero" è dal "return true" nello
operator bool (X x)
OK - Così cambiamo
Console.WriteLine(X.M(1, out a));
a
Console.WriteLine(X.M(1, out a) && X.M(2, out b));
ora - il risultato è:
x = 1
in false operator for 1
in bool operator for 1
True
2 domande:
Perché viene eseguito questo
in false operator for 1
? Non vedo alcun motivo per cuifalse
sia presente qui.Posso capire perché la parte destra in
X.M(1, out a) && X.M(2, out b)
non verrà eseguita SOLO se la parte sinistra èfalse
- ma di nuovo non vedo come la parte sinistra possa essere falsa. Lo fa tornaretrue
(secondo il mio primo codice)
NB
ho letto molte volte le risposte da posta:
Jon ha detto:
Il secondo & & è un normale & & tra due espressioni bool - perché Nop r eturns bool, e non c'è l'operatore & (X, bool) ... ma c'è una conversione da X a bool.
Quindi è più simile a:
bool primo = X.M (1, out a) & & X.M (2, fuori b);
se (prima & & Nop (a, b))Ora prima è vero anche se solo il primo operando di & & è stata valutata ... quindi b in realtà non è stato assegnato.
Ancora non capisco: "prima è true
(????), anche se solo il primo operando di & & è stato valutato"
Se l'operatore 'false()' restituisce 'true', significa che l'operazione restituisce' false' ("è x falso? Sì è (restituisce true;)")! Non è un 'operatore bool()'. – xanatos
L'operatore 'false()' è chiamato a cortocircuitare '&&' ... Potrebbero aver chiamato l'operatore' true() ', ma per esempio la definizione di' && 'in [msdn] (https://msdn.microsoft.com/en-us/library/2a723cdk.aspx): * tranne che ** se x è falso **, y non viene valutato * – xanatos
Vedere http://stackoverflow.com/a/5203515/613130 : * && è definito come un operatore di cortocircuito; ** se il primo operando valuta falso **, viene richiesto di cortocircuitare e non valutare il lato destro. * – xanatos