2011-01-04 14 views
5

me estoy haciendo una excepción cuando se utiliza contratos de código en el siguiente código:excepción de atributo condicional con el Código de Contratos

public void Debug(
      dynamic message1, 
      dynamic message2 = null, 
      dynamic message3 = null, 
      dynamic message4 = null, 
      dynamic message5 = null, 
      dynamic message6 = null) 
    { 
     Contract.Requires(message1 != null, 
      "First Logged Message cannot be null"); 
    } 

Estoy intentando configurar la configuración del proyecto a fin de que los controles se realizan en tiempo de ejecución .

La excepción es "No se puede invocar dinámicamente el método 'Requiere' porque tiene un atributo Condicional". He vuelto a leer la documentación de Contratos de código un par de veces y he hecho algunas búsquedas, pero no entiendo de dónde proviene el atributo condicional.

Respuesta

11

El atributo condicional en el método Requires es Conditional("CONTRACTS_FULL"). Cuando construye con contratos activados, el símbolo CONTRACTS_FULL se pasa al compilador. Supongo que la razón por la que no puede usar el despacho dinámico con métodos condicionales es porque están compilados durante el tiempo de ejecución, y el tiempo de ejecución no tiene forma de pasar estos símbolos al compilador. (Solo una suposición).

Probablemente pueda resolverlo fácilmente asignando message1 a una variable local (no dinámica), quizás un objeto.

 object m1 = message1; 
    Contract.Requires(m1 != null, "First Logged Message cannot be null"); 
+0

Eso funcionó. Gracias. –

1

Me encontré con el mismo problema en lugar de crear una asignación de variable. Pude transmitir la dinámica a un objeto en el argumento de condición de necesidad.

dynamic message1; 
Contract.Requires((object)message1 != null,"First Logged Message cannot be null"); 
Cuestiones relacionadas