2015-02-11 9 views
11

sto ottenendo questo avvertimento, ma non riesco a capire il problema ...CodeContracts: la condizione booleana viene valutata a un valore costante, perché?

CodeContracts: Attenzione: La condizione booleana d1.Count = d2.Count restituisce sempre un valore costante. Se esso (o la sua negazione) appaiono nel codice sorgente, si può avere qualche codice morto o ridondante controllo

Il codice è il seguente:

public static bool DictionaryEquals<TKey, TValue>(IDictionary<TKey, TValue> d1, IDictionary<TKey, TValue> d2) 
{ 
    if (d1 == d2) return true; 
    if (d1 == null || d2 == null) return false; 
    if (d1.Count != d2.Count) return false; // <-- warning here 

    // Equality check goes here 

    return true; 
} 

La parte // Equality check goes here può essere così com'è , o sostituito da a proper implementation e ho ancora lo stesso avviso.

+0

Sembra che '(d1 == d2)' dovrebbe essere cambiato in 'Object.ReferenceEquals (d1, d2)' –

+0

@DmitryBychenko Che fa la stessa cosa. Non esiste un operatore sovraccarico per 'IDictionary '. – hvd

+0

@hvd Non è possibile fornire il sovraccarico dell'operatore per le interfacce –

risposta

5

Questo è semplicemente un bug nei contratti di codice. È facile inventare input che rendono questa condizione vera o falsa. L'avviso è fasullo.

Per esperienza personale, so che i bug in CC non sono rari.

Come risolvere? Poiché si tratta di un bug, non esiste una linea di condotta ufficiale/prevista. Segnala l'errore. Far ruotare il codice fino a quando l'avviso non scompare (ad esempio, prova con lo ReferenceEquals che è comunque lo stile migliore). Sopprimi l'avvertimento. Cose così.

+0

Si tratta di un bug noto o si sta ipotizzando? Puoi collegarti a un bug report ufficiale? – Keith

+1

@Keith come potrebbe non essere un bug? La dichiarazione fatta in quell'avvertimento è chiaramente falsa. – usr

+0

Non sono ancora convinto che sia un bug. Vedi il mio commento all'OP sopra. Il codice chiamante potrebbe essere scritto in modo da garantire che la condizione sia sempre falsa. – Keith