具有生成器模式的C#代码契约-“;可能对空引用调用方法”;

本文关键字:引用 方法 调用 模式 契约 代码 | 更新日期: 2023-09-27 17:58:30

我正在研究代码契约,并正在实现这样的生成器模式:

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

然而,代码合同静态检查器失败,并出现以下错误:

可能对null引用调用方法。您希望NWP.PointServices.Domain.Model.Peoples.PersonCaution+Builder.WithCautionType(System.String)返回非null吗?

Q。我以为Contract.确保后条件会满足静态检查器的要求,但事实并非如此。我需要做些什么来删除错误?非常感谢

注意。只有当Builder类与调用它的代码在一个单独的项目中时,我才会看到这个问题。

更多信息:

  • Visual Studio Professional 2015 14.0.25424.00更新3
  • 所有项目目标.Net 4.6.1
  • 通过Visual Studio扩展1.8版安装的代码约定
  • 我在项目的其他(非构建者)领域成功地使用了代码合约

具有生成器模式的C#代码契约-“;可能对空引用调用方法”;

正如我们所发现的,您所需要的只是从CC项目选项卡启用合同参考的构建,以启用跨项目分析("合同参考汇编"="构建")