C#与Builder模式的代码契约 - “可能在空引用上调用方法”

时间:2016-07-25 14:21:34

标签: c# code-contracts builder-pattern

我正在调查Code Contracts,我正在实现这样的Builder Pattern:

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());
    }
}

但是,Code Contracts静态检查程序失败并出现此错误:

  

可能在空引用上调用方法。您是否期望NWP.PointServices.Domain.Model.People.PersonCaution + Builder.WithCautionType(System.String)返回非null?

问。我认为Contract.Ensures后置条件会满足静态检查器,但事实并非如此。我该怎么做才能删除错误?非常感谢。

注意。如果Builder类与调用它的代码位于单独的Project中,我只会看到问题。

更多信息:

  • Visual Studio Professional 2015 14.0.25424.00 Update 3
  • 所有项目均以.Net 4.6.1
  • 为目标
  • 通过Visual Studio Extension v 1.8
  • 安装的代码合同
  • 我在项目的其他(非构建器)区域成功使用了代码契约

1 个答案:

答案 0 :(得分:1)

正如我们所知,您只需要从CC项目选项卡启用合同参考的构建,以启用跨项目分析(&#34;合同参考大会&#34; =&#34; Build&#34;)