16

Este es mi código:¿Estoy implementando este simple contrato incorrectamente?

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

} 

me han tratado tanto con los Contract.Requires y Contract.Invariant métodos para prevenir la variable vertexCount se convierta menor o igual a 2; sin embargo, todavía puedo inicializar un Polígono regular con 2 lados o menos. Mi prueba (simplificada) NUnit 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 se aprueba y no puedo entender por qué.

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

método se salta. 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. Así que supongo que es solo porque ReSharper aún no tiene compatibilidad destacada para los contratos de código.

He revisado la documentación y, por lo que puedo ver, no debería tener este problema.

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

Gracias.

Respuesta

18

Lo primero que debe verificar es si realmente tiene activada la verificación de contratos. Si no, ninguno de sus contratos hará nada. Eso explicaría la advertencia R # también. Consulte "Contratos de código" en las propiedades de compilación y vea lo que dice en "Verificación en tiempo de ejecución".

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

Segundo punto: usted tiene campos variables públicas, lo que significa que su invariante puede ser violada en cualquier momento por alguien que escribe

polygon.VertexCount = 0; 

Por favor, no use los campos públicos, en particular los no modificables. :)

+0

¿No sería así el método invariante? Pensé que para eso estaban. Lo anterior no es mi código completo, solo un ejemplo para demostrar mi problema. Si activa la verificación de contrato quiere decir ir a las propiedades del proyecto> Contratos de código> comprobación estática/comprobación completa del tiempo de ejecución, sí, están encendidos ahora (no estaban antes) pero todavía tengo el mismo problema. – Nobody

+0

@rmx: los métodos invariables no se ejecutarán cuando solo cambie los campos. ¿Como pudireon? No hay un código para que se enganchen, a menos que el código de llamada haya sido modificado. Ahora, en términos de tener "el mismo problema", ¿tiene * todos * los mismos síntomas? ¿El R # todavía está encaneciendo? –

+0

OK, cancela eso. Lo tengo trabajando. Mis métodos Invariant también deben ser privados. Todavía recibí el mensaje R # y la línea en gris, pero no parece afectar la funcionalidad de los contratos.Espero que lo arreglen en el próximo lanzamiento. – Nobody

Cuestiones relacionadas