2012-06-27 37 views
3

爲什麼.NET的契約抱怨這個代碼?代碼合同不檢查空條件。爲什麼?

private static User GetUser() 
{ 
    var sFirstName = Console.ReadLine(); 
    var sLastName = Console.ReadLine(); 
    if (sLastName == "NULL") 
    { 
     return null; 
    } 
    else 
    { 
     return new User(sLastName, sFirstName); 
    } 
} 
public static int Main(string[] args) 
{ 
     var oUser = GetUser(); 
     DisplayUser(oUser); 
     Console.ReadLine(); 
     return 0; 
} 
private static void DisplayUser(User user) 
{ 
    Contract.Requires(user != null); 
    Console.WriteLine(user.ToString()); 
} 

的getUser可以返回null,但合同從來不說,我必須將它傳遞給DisplayUser前檢查返回值。爲什麼?


自動應答:沒有在代碼中警告級別合同的配置。我應該從低到高。

+0

可能是因爲它不爲空。嘗試檢查'if(sLastName.IsNullOrEmpty())'而不是。 – 2012-06-27 12:18:05

+0

@ 0A0D - 如果你輸入字符串「NULL」,你*會得到一個'null'返回值。 –

+0

@HansKesting:啊,錯過了。 – 2012-06-27 12:27:18

回答

2

根據this msdn頁面,如果您沒有在Visual Studio中安裝正確的插件,則不會強制實施合約。你有沒有安裝該插件?

您必須安裝Visual Studio加載項才能執行合同。代碼 Contracts Premium Edition加載項允許您在項目屬性頁面上指定代碼合同的靜態和運行時間 檢查。如果 未啓用運行時檢查,則合同如 違反,合同(如Contract.Ensures 方法)在運行時不會拋出異常。 Visual Studio加載項不附帶Visual Studio 2010或Windows SDK。

+0

我確實安裝了它。我選中複選框「執行靜態合同檢查」。 如果我將GetUser替換爲 private static User GetUser() { return null; } 合同會投訴。 – user1485585

相關問題