2013-01-24 8 views
12

Ho un condizionale che sto scrivendo che sta controllando tre cose.Cercando di capire perché il resharper mi ha detto che l'espressione è sempre falsa

if(LoggedInMembershipUser == null || obj == null || boolVal) 

in questo caso "LoggedInMembershipUser" è solo il Membership.GetUser(), "obj" è un oggetto di business a caso, e "boolVal" è ovviamente un valore booleano. Quando scrivo la dichiarazione come sopra, il resharper mi dice che la parte boolVal dell'istruzione è sempre falsa. Ma quando metto BoolVal all'inizio come sotto non ho notato questo.

if(boolVal|| LoggedInMembershipUser == null || obj == null) 

Perché il primo sarebbe sempre falso ma il secondo no?

MODIFICA: si tratta del binding dei dati di riga di una vista a griglia. La griglia sta visualizzando i risultati di due oggetti con la stessa classe base, quindi "obj" avrà un valore se è uno dei tipi di oggetto ma non dell'altro. boolVal è un indicatore per quale tipo di oggetto è così ora che ci penso penso che se obj è nullo allora boolVal sarà sempre vero. È stato resharper rendendosi conto che alcuni come? Oh, scommetto che è perché guardando il mio codice sopra la linea che ho:

if (!uploaded){ 
    var obj = GetObjectLogic(); 
} 

Ok grazie per i commenti di aiuto. Immagino che questo possa essere votato per essere cancellato o qualsiasi altra cosa.

+2

È 'boolVal' una variabile locale, un campo o una proprietà? La stessa domanda per 'obj' e' LoggedInMembershipUser'. –

+0

L'unica cosa che viene in mente è il cortocircuito. Prova a usare '|' invece di '||' e vedi se il resharper si lamenta ancora. – juharr

+0

puoi mettere insieme un (breve) metodo di test in modo da poterlo vedere nel contesto. – gh9

risposta

15

Senza più del metodo è difficile sapere con certezza, ma sembra certo ike il seguente:

ReSharper ha stabilito che l'unico modo che boolVal può essere vero è se almeno uno dei LoggedInMembershipUser o obj è zero. Il primo if non raggiunge mai la porzione boolval a meno che entrambi non siano nulli. Quindi nel punto in cui viene valutato boolVal deve essere falso.

Se si riordinano le condizioni, la logica non è più valida. ReSharper potrebbe potenzialmente analizzare quell'espressione, determinare che tutte le parti siano veloci e senza effetti collaterali e notare che boolVal non è necessario nel secondo caso, ma che l'analisi è un po 'più difficile e apparentemente non è stata scritta.

+0

Sì, questo è quello che sta succedendo. L'ho capito mentre stavo creando la modifica per il mio post. – William

+0

Sì e ho notato la modifica subito dopo aver postato la mia risposta. Vai a capire! :-) –

2

Ogni volta che ho indagato su uno scenario inaspettato Expression is always true|false con ReSharper, lo strumento si è dimostrato più intelligente di me. Ad esempio, ReSharper è a conoscenza degli alberi ereditari; in questo blocco di codice:

void doSomething(Object obj) 
{ 
    if(obj is StreamReader || obj is TextReader) 
     foo(); 
} 

... ReSharper segnerà (obj is TextReader) come Expression is always false, perché il ramo (obj is StreamReader) codice sarà già catturato qualsiasi TextReader oggetti e saltato foo(), cortocircuitando qualsiasi ulteriore valutazione.

Problemi correlati