Perché viene visualizzato il seguente avviso per questo esempio di codice banale non appena il livello di avviso si trova al 2 ° livello o superiore?Falso positivo: la precondizione è ridondante
public int Foo(int a)
{
if (a >= 0) throw new ArgumentException("a should be negative", "a");
Contract.EndContractBlock();
return a;
}
CodeContracts: suggerite richiede: Questo presupposto è ridondante: consideri rimuoverlo. Stai confrontando un valore di struct con null?
Chiaramente un numero intero può essere negativo, quindi la precondizione è difficilmente ridondante, quindi perché viene visualizzato questo avviso?
Edit: Ecco cosa ILSpy mostra per la funzione creata quando guardando l'exe:
public int Foo(int a)
{
if (a >= 0)
{
ContractHelper.RaiseContractFailedEvent(ContractFailureKind.Precondition, null, "a < 0", null);
throw new ArgumentException("a should be negative", "a");
}
return a;
}
Da dove si utilizza 'B' nella funzione? –
@Lakshay Niente affatto in questa versione ridotta. Ma rimuoverlo non rimuove il suggerimento. Appena trascurato quando si crea un esempio minimo, rimosso. – Voo
Sei sicuro che questo è il codice esatto? Potrebbe essere che il confronto venga eseguito su un numero intero senza segno, ad esempio?Puoi controllare l'IL che questo genera? – Luaan