c# visual-studio-2010 resharper code-contracts design-by-contract

c# - ¿Estoy implementando este simple contrato incorrectamente?



visual-studio-2010 resharper (1)

Este es mi código:

public class RegularPolygon { public int VertexCount; public double SideLength; public RegularPolygon(int vertexCount, double sideLength) { Contract.Requires(vertexCount >= 3); VertexCount = vertexCount; SideLength = sideLength; } [ContractInvariantMethod] private void RegularPolygonInvariants() { Contract.Invariant(VertexCount>=3); } }

He intentado con los métodos Contract.Requires y Contract.Invariant para evitar que la variable vertexCount sea menor o igual a 2; sin embargo, todavía puedo inicializar un RegularPolygon con 2 o menos lados. Mi prueba NUnit (simplificada) se ve así:

[TestFixture] class TestRegularPolygon { private RegularPolygon _polygon; [SetUp] public void Init() { _polygon = new RegularPolygon(1, 50); } [Test] public void Constructor() { Assert.That(_polygon.VertexCount,Is.GreaterThanOrEqualTo(3)); } }

La prueba anterior también pasa y no puedo entender por qué!

Al principio, pensé que ReSharper podría haber estado ensuciando algo porque se pone gris en la línea y muestra este mensaje cada vez que intento usar un método en el espacio de nombres del Contract :

Se omite la invocación del método. El compilador no generará la invocación del método porque el método es condicional o es un método parcial sin implementación.

Pero suspender R # y ejecutar las pruebas en NUnit tiene el mismo resultado sin errores ni advertencias en VS tampoco. Entonces asumo que es solo porque ReSharper aún no tiene compatibilidad de resaltado para los contratos de código.

He examinado la documentación y, por lo que sé, no debería tener este problema.

¿Estoy utilizando incorrectamente los contratos de código o mi entorno impide que funcione de alguna manera?

Gracias.


Lo primero que hay que verificar: ¿tiene activada la verificación de contratos? Si no, ninguno de sus contratos hará nada. Eso explicaría la advertencia de R #, también. Busque en "Contratos de código" en las propiedades de compilación y vea lo que dice en "Comprobación en tiempo de ejecución".

Según los comentarios, asegúrese de que tiene CONTRACTS_FULL definido como un símbolo de compilación, que parece ser lo que requiere R #.

Segundo punto: tienes campos mutables públicos, lo que significa que tu invariante puede ser violada en cualquier momento por alguien que escribe

polygon.VertexCount = 0;

Por favor, no use campos públicos, particularmente los que no se pueden escribir. :)