1

我面临一个我无法弄清楚的问题。

假设我有两种方法:public void Method1(object obj)ViewModel课堂上和public void Method2(object obj)课堂Model上。

Method2Method1使用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())
                    )

            )

请建议。

4

2 回答 2

0

我不相信静态检查器将能够验证您的合同,因为obj直到运行时才知道类型 - 不能保证只有类型的对象 Class1Class2将被传递给Method1.

可以通过向调用Method1. 如果您包含该代码,我可能会提出一种满足静态检查器的方法。

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

于 2013-01-23T13:15:18.753 回答