代码合同理解错误

Dav*_*ams 8 .net-4.0 code-contracts

我刚开始使用Code Contracts,需要一些帮助来纠正错误:

鉴于此代码:

class MyClass
{
    private bool _isUsed = false;

    public void SomeMethod()
    {
        Contract.Requires(!_isUsed);
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error CC1038: Member 'MyClass._isUsed' has less visibility than the enclosing method 'MyClass.SomeMethod'
Run Code Online (Sandbox Code Playgroud)

这似乎使很多标准检查不可用.我在这个例子中缺少什么?

vos*_*d01 8

已经解释过,要么_isUsed具有可见性问题(调用者没有控制权),要么正确执行.

但是,根据您要通过合同完成的任务,Contract.Assert可能会满足您的需求.

public void SomeMethod()
{
    Contract.Assert(!_isUsed);
}
Run Code Online (Sandbox Code Playgroud)

当需求不是时,它将是有效的.


tay*_*onr 5

你有一个公共方法SomeMethod.但是,您要求将私有成员变量设置为false.您无法设置_isUsed,因此您要检查调用者无法控制的变量.

你可以将_isUsed变成属性即

public bool IsUsed {get; set;}
Run Code Online (Sandbox Code Playgroud)

然后在你的SomeMethod()中

Contract.Requires(!IsUsed);
Run Code Online (Sandbox Code Playgroud)