2015-02-11 10 views
11

Dostaję to ostrzeżenie, ale nie można dowiedzieć się problem ...CodeContracts: Warunek logiczny jest wartością stałą, dlaczego?

CodeContracts: ostrzeżenie: Boolean stan d1.Count = d2.Count zawsze ma wartość stałą wartość. Jeśli to (lub jego negacja) pojawiają się w kodzie źródłowym, można mieć pewne martwego kodu lub redundantny czek

Kod jest w następujący sposób:

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; 
} 

// Equality check goes here część może być tak jest lub zastąpione przez a proper implementation i wciąż otrzymuję to samo ostrzeżenie.

+0

Wydaje się, że "(d1 == d2)" należy zmienić na "Object.ReferenceEquals (d1, d2)" –

+0

@DmitryBychenko To robi to samo. Nie ma przeciążonego operatora dla 'IDictionary '. – hvd

+0

@hvd Nie można zapewnić przeciążenia operatora dla interfejsów –

Odpowiedz

5

To po prostu błąd w umowach Code. Łatwo jest wymyślić dane wejściowe, które sprawiają, że ten warunek jest prawdziwy lub fałszywy. Ostrzeżenie jest fałszywe.

Z własnego doświadczenia Wiem, że błędy w CC nie są rzadkie.

Jak naprawić? Ponieważ jest to błąd, nie ma oficjalnego/zamierzonego kierunku działania. Zgłoś błąd. Przekręcaj kod do momentu, aż ostrzeżenie zniknie (na przykład spróbuj ReferenceEquals, co i tak jest lepszym stylem). Pomiń ostrzeżenie. Rzeczy jak te.

+0

Czy jest to znany błąd, czy też spekulujesz? Czy możesz utworzyć link do oficjalnego zgłoszenia błędu? – Keith

+1

@Keith, czy to nie może być błąd? Oświadczenie złożone w tym ostrzeżeniu jest wyraźnie fałszywe. – usr

+0

Nie jestem jeszcze przekonany, że to błąd. Zobacz mój komentarz do OP powyżej. Kod wywołujący może być napisany w sposób zapewniający, że warunek jest zawsze fałszywy. – Keith

Powiązane problemy