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.
¿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
@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? –
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