2016-07-25 25 views
3

我調查代碼契約,我實現了Builder模式是這樣的:C#代碼契約與生成器模式 - 「可能調用空引用的方法」

public class PersonCaution 
{ 
    private PersonCaution() 
    { 
    } 

    public string CautionType { get; private set; } 
    public string Remarks { get; private set; } 

    public class Builder 
    { 
     private string _cautionType; 
     private string _remarks; 

     public Builder WithCautionType(string value) 
     { 
      Contract.Ensures(Contract.Result<Builder>() != null); 

      _cautionType = value;     
      return this; 
     } 

     public Builder WithRemarks(string value) 
     { 
      Contract.Ensures(Contract.Result<Builder>() != null); 

      _remarks = value; 
      return this; 
     } 

     public PersonCaution Build() 
     { 
      Contract.Ensures(Contract.Result<PersonCaution>() != null); 

      return new PersonCaution 
      { 
       CautionType = _cautionType, 
       Remarks = _remarks 
      }; 
     } 
    } 
} 

這裏有一個片段展示瞭如何我使用Builder類:

if (row != null) 
{ 
    var builder = new PersonCaution.Builder() 
     .WithCautionType((string)row.Element("PersonCaution__Type1G")) 
     .WithRemarks((string)row.Element("PersonCaution__Remarks")); 

    if (builder != null) 
    { 
     personCautions.Add(builder.Build()); 
    } 
} 

然而,代碼契約靜態檢查失敗,此錯誤:

Possibly calling a method on a null reference. Do you expect that NWP.PointServices.Domain.Model.People.PersonCaution+Builder.WithCautionType(System.String) returns non-null?

問:我認爲Contract.Ensures後置條件會滿足靜態檢查器,但它不會。我需要做些什麼來消除錯誤?非常感謝。

注意。如果Builder類在一個單獨的項目中,只有調用它的代碼纔會看到問題。

更多信息:

  • 的Visual Studio專業2015 14.0.25424.00更新3個
  • 所有項目面向.NET通過的Visual Studio擴展安裝4.6.1
  • 代碼契約,V 1.8
  • 我在項目的其他(非Builder)領域成功使用代碼合同
+0

嗯,我在更新3和代碼合同不是隻檢查一切正常,但也給了我一個警告,(建設者!= null)評估是多餘的因爲建設者總是不爲空。 看來我不能幫你在這一個。 –

+0

@ Sergey.quixoticaxis.Ivanov - 謝謝。我在上面添加了一個註釋,如果Builder類在單獨項目中,只有調用它的代碼纔會看到問題。代碼合同設置對於每個項目都是相同的。 – Howard

+0

再次您好。我將Builder類移動到另一個DLL,它仍然適用於我: -/ 以防萬一,您是否啓用了具有Builder類定義的程序集的Contract Reference Assembly = Build? –

回答

1

因爲我們已經發現,所有你需要的是從CC項目選項卡啓用合同引用的構建,以啓用跨項目分析(「合同參考大會」=「構建」)

+0

試過這兩個,謝謝;但錯誤依然存在。 – Howard

+0

這真的很奇怪,我複製粘貼你的代碼到一個示例控制檯項目,CC給了我沒有任何警告。我使用了VS2015社區和CC的最新更新。 –

+0

我編輯了一些附加信息。 – Howard