我遇到了一个我无法弄清楚的问题。
假设我有两种方法:public void Method1(object obj)
类中的ViewModel
和public void Method2(object obj)
类中的Model
。
Method2
类的实例从Method1
调用 Model
(例如,objM是Model
类的对象和ViewModel
类的成员)。
class ViewModel
{
public void Methods1(object obj)
{
if (!(
( (false == this.HasSal)
&& (typeof(Class1) == obj.GetType())
)
||
( (true == this.HasSal)
&& (typeof(Class2) == obj.GetType())
)
)
)
{
throw new ArgumentException("invalid obj");
}
Contract.EndContractBlock();
objM.Method2(obj);
.....
}
}
class Model
{
public void Method2(object obj)
{
Contract.Requires(
( (false == this.HasSal)
&& (typeof(Class1) == obj.GetType())
)
||
( (true == this.HasSal)
&& (typeof(Class2) == obj.GetType())
)
);
.....
}
}
现在每当我尝试构建代码时,Visual studio都会生成以下警告
Code contracts: Requires unproven
(
( (false == this.HasSal)
&& (typeof(Class1) == obj.GetType())
)
||
( (true == this.HasSal)
&& (typeof(Class2) == obj.GetType())
)
)
请建议。
答案 0 :(得分:0)
由于rtrokzzz在评论中提供了另一个SO问题.NET 4 Code Contracts: “requires unproven: source != null”的链接
您的解决方案是在Contract.Ensures
和Method1()
Method2()
请注意:我没有使用Code Contracts
,但我相信我的理解代码将是
Contract.Ensures(obj != null);
Contract.Requires(obj != null);
参考:How to avoid “source !=null” when using Code Contracts and Linq To Sql?
答案 1 :(得分:0)
我不相信静态检查程序能够验证您的合同,因为obj
的类型在运行时才知道 - 不能保证只有 Class1
或Class2
类型的对象将传递给Method1
。
可以通过向调用Method1
的方法添加其他合同来证明这一点。如果您包含该代码,我可能会建议一种方法来满足静态检查器。
编辑:实际上,还有另一个问题。如果HasSal
是公共设置者属性,那么我不确定您的合同是否可以被验证 - 另一个线程总是有可能在HasSal
之间更改Method1
的值调用和正在执行的方法体。