我調查代碼契約,我實現了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)領域成功使用代碼合同
嗯,我在更新3和代碼合同不是隻檢查一切正常,但也給了我一個警告,(建設者!= null)評估是多餘的因爲建設者總是不爲空。 看來我不能幫你在這一個。 –
@ Sergey.quixoticaxis.Ivanov - 謝謝。我在上面添加了一個註釋,如果Builder類在單獨項目中,只有調用它的代碼纔會看到問題。代碼合同設置對於每個項目都是相同的。 – Howard
再次您好。我將Builder類移動到另一個DLL,它仍然適用於我: -/ 以防萬一,您是否啓用了具有Builder類定義的程序集的Contract Reference Assembly = Build? –