c#中的代码合同问题

时间:2013-01-23 06:42:09

标签: c# code-contracts

我遇到了一个我无法弄清楚的问题。

假设我有两种方法:public void Method1(object obj)类中的ViewModelpublic 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())
                    )

            )

请建议。

2 个答案:

答案 0 :(得分:0)

由于rtrokzzz在评论中提供了另一个SO问题.NET 4 Code Contracts: “requires unproven: source != null”的链接

您的解决方案是在Contract.EnsuresMethod1()

中添加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的类型在运行时才知道 - 不能保证只有 Class1Class2类型的对象将传递给Method1

可以通过向调用Method1的方法添加其他合同来证明这一点。如果您包含该代码,我可能会建议一种方法来满足静态检查器。

编辑:实际上,还有另一个问题。如果HasSal是公共设置者属性,那么我不确定您的合同是否可以被验证 - 另一个线程总是有可能在HasSal之间更改Method1的值调用和正在执行的方法体。