¿Por qué recibo la siguiente advertencia para este ejemplo de código trivial tan pronto como el nivel de advertencia está en el segundo nivel o superior?
public int Foo(int a) { if (a >= 0) throw new ArgumentException("a should be negative", "a"); Contract.EndContractBlock(); return a; }CodeContracts: requisitos sugeridos: esta condición previa es redundante: considere eliminarla. ¿Estás comparando un valor de estructura con nulo?
Claramente, un número entero puede ser negativo, por lo que la condición previa no es redundante, entonces, ¿por qué recibo esta advertencia?
Editar: esto es lo que muestra ILSpy para la función creada al mirar el 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; } 
Sé que esto no responde directamente a su pregunta, pero parece que está usando un modo heredado para los contratos de código.
Este documento describe el modo de ensamblaje recomendado en función de los requisitos de uso:
http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf
De las páginas 20, 21...

Otro fragmento del documento:
5.1.1 Modo de montaje
Las herramientas de contrato necesitan saber qué modo de uso elige. Si usa VisualStudio, seleccione el modo de ensamblaje en el panel de propiedades del contrato de la siguiente manera:
- Uso 1 o 2: Requiere contrato estándar
- Uso 3: Validación de parámetros personalizados
Esto permite que las herramientas emitan advertencias adecuadas cuando viola las pautas de uso. Si usa las herramientas desde la línea de comandos, pase el argumento adecuado para la opción -assemblyMode
Por lo tanto, al usar el modo de ensamblaje "Requiere contrato estándar", podría hacer cualquiera de las siguientes cosas:
Contract.Requires<ArgumentException>(a < 0, "a"); // OR Contract.Requires(a < 0, "a should be negative");Ninguno de estos genera ninguna advertencia para mí.
Espero que esto ayude de todos modos.
Saludos peteski