Условное исключение атрибута с контрактами кода - PullRequest
5 голосов
/ 04 января 2011

Я получаю исключение, когда использую кодовые контракты для следующего кода:

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

Я пытаюсь настроить параметры проекта так, чтобы проверки выполнялись во время выполнения.

Исключением является "Невозможно динамически вызвать метод" Требуется ", поскольку он имеет атрибут" Условие "" . Я несколько раз перечитывал документацию Code Contracts и провел несколько поисков, но не понимаю, откуда берется условный атрибут.

Ответы [ 2 ]

11 голосов
/ 04 января 2011

Условный атрибут в методе Требуется Conditional("CONTRACTS_FULL"). Когда вы строите с включенными контрактами, символ CONTRACTS_FULL передается компилятору. Я предполагаю, что причина, по которой вы не можете использовать динамическую диспетчеризацию с условными методами, заключается в том, что они компилируются во время выполнения, а среда выполнения не может передать эти символы компилятору. (Просто предположение).

Вероятно, вы можете решить это действительно легко, назначив message1 локальной (нединамической) переменной, возможно, объекту.

     object m1 = message1;
     Contract.Requires(m1 != null, "First Logged Message cannot be null");
1 голос
/ 17 августа 2012

Я столкнулся с той же проблемой, вместо создания присваивания переменной, я смог привести динамику к объекту в аргументе require.

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