当我在以下代码上使用代码契约时,我遇到了异常:
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文档并完成了一些搜索,但我不明白条件属性的来源。
答案 0 :(得分:11)
Requires方法的条件属性为Conditional("CONTRACTS_FULL")
。在打开合同的情况下构建时,CONTRACTS_FULL符号将传递给编译器。我假设你不能使用条件方法动态调度的原因是因为它们是在运行时编译的,而运行时无法将这些符号传递给编译器。 (只是一个猜测)。
通过将message1分配给本地(非动态)变量(可能是对象),您可以很容易地解决它。
object m1 = message1;
Contract.Requires(m1 != null, "First Logged Message cannot be null");
答案 1 :(得分:1)
我遇到了同样的问题而没有创建变量赋值我能够将动态转换为requires条件参数中的对象。
dynamic message1;
Contract.Requires((object)message1 != null,"First Logged Message cannot be null");