2010-05-21 17 views
6

estoy usando la biblioteca 3.5 para el código de Microsoft contrae¿Qué significa "Contrato no puede estar en bloqueo de prueba"?

public object RetrieveById(int Id) 
{  
    //stuff happens... 
    Contract.Ensures(newObject != null, "object must not be null"); 
    return newProject; 
    //No error message if I move the Contract.Ensures to here 
    //But it isn't asserting/throwing a contract exception here either   
} 

me sale el mensaje del compilador: "Error 18 dentro de la sección Contrato bloque try en el método 'Controller.RetrieveById (System.Int32)'

ACTUALIZACIÓN:

lo he descubierto con su ayuda:

  • Mover al principio
  • Comprobar contra Contract.Result

    Contract.Ensures (Contract.Result() = null, "objeto no debe ser nulo"!);

+0

puede publicar todo el contenido de su método. Además, 'Contract.Ensures' debe ser la primera línea de código en cualquier método. El código después de su declaración de devolución será inalcanzable. Esto explica por qué moverlo allí no hace nada. –

Respuesta

6

puede ser que falte algo, pero yo miraba a la documentación para esto:

http://msdn.microsoft.com/en-us/library/dd412865.aspx

que dice:

llamada

Este método debe estar en el comenzando de un método o propiedad, antes de cualquier otro código.

Así que simplemente deje la llamada de Asegura en la parte superior del método y no debería tener ningún problema.

+3

Qué terrible mensaje de error. –

2

Aquí es una solución similar:

http://social.msdn.microsoft.com/Forums/en/codecontracts/thread/43f467f1-14b7-4e56-8030-50f842b7ba68

Su reciente edición muestra que tiene el código de la declaración Contract.Ensures. Contract.Ensures debe llegar antes que cualquier otro código en su método, por lo que:

public object RetrieveById(int Id) 
{  
    //first line of method: 
    Contract.Ensures(newObject != null, "object must not be null"); 

    //stuff happens... 

    return newProject;   
} 
2

Es bastante simple: el contrato de violaciónes señales clase de contrato por lanzar una excepción. Ponerlo en un intento de bloqueo frustra el objetivo, es probable que atrape la excepción.

Cuestiones relacionadas