2011-01-04 4 views
5

sto ottenendo un'eccezione quando uso dei contratti di codice sul codice seguente:condizionale Eccezione attributo con codice dei contratti

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

Sto cercando di configurare le impostazioni del progetto in modo che i controlli vengono effettuati in fase di esecuzione .

L'eccezione è "Impossibile richiamare dinamicamente il metodo 'Richiede' perché ha un attributo Condizionale". Ho riletto la documentazione dei Contratti di codice un paio di volte e ho fatto alcune ricerche, ma non capisco da dove provenga l'attributo condizionale.

risposta

11

L'attributo condizionale nel metodo Richieste è Conditional("CONTRACTS_FULL"). Quando costruisci con i contratti attivati, il simbolo CONTRACTS_FULL viene passato al compilatore. Presumo che il motivo per cui non è possibile utilizzare l'invio dinamico con metodi condizionali, è perché sono stati compilati durante il runtime e il runtime non ha modo di trasmettere questi simboli al compilatore. (Solo una supposizione).

Probabilmente è possibile risolverlo davvero facilmente assegnando message1 a una variabile locale (non dinamica), forse un oggetto.

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

Ha funzionato. Grazie. –

1

Ho eseguito lo stesso problema invece di creare un assegnamento di variabile. Sono riuscito a trasmettere la dinamica a un oggetto nell'argomento della condizione necessaria.

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