Dot-Net-4.0

Code Contract 理解錯誤

  • August 13, 2012

我剛剛開始使用程式碼契約,需要一些幫助來糾正錯誤:

鑑於此程式碼:

class MyClass
{
   private bool _isUsed = false;

   public void SomeMethod()
   {
       Contract.Requires(!_isUsed);
   }
}

我收到以下錯誤:

error CC1038: Member 'MyClass._isUsed' has less visibility than the enclosing method 'MyClass.SomeMethod'

這似乎使許多標準檢查不可用。我在這個例子中遺漏了什麼?

你有一個公共方法 SomeMethod。但是,您需要將私有成員變數設置為 false。您無法設置 _isUsed,因此您要檢查呼叫者無法控制的變數。

你可以把 _isUsed 變成一個屬性,即

public bool IsUsed {get; set;}

然後在你的 SomeMethod() 中有

Contract.Requires(!IsUsed);

已經解釋過兩者_isUsed都存在可見性問題(呼叫者沒有控制權),這是由要求正確執行的。

但是,根據您試圖通過契約完成的任務,Contract.Assert可能會滿足您的需求。

public void SomeMethod()
{
   Contract.Assert(!_isUsed);
}

Requires 無效時有效。

引用自:https://stackoverflow.com/questions/6362974