2016-07-25 7 views
3

Я расследую код Контракты и я реализации Builder шаблон вроде этого:C# Код Контракты с 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()); 
    } 
} 

Однако код Контракты статических проверки терпят неудачу с этой ошибкой:

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 Professional 2015 14.0.25424.00 Update 3
  • Все проекты ориентированы на .Net 4.6.1
  • Код контракты, установленные с помощью Visual Studio Extension, v 1,8
  • Я успешно использую кодовые контракты в других (нестроительных) областях проекта
+0

Ну, я нахожусь в обновлении 3, а кодовые контракты не только проверил все нормально, но также дал мне предупреждение, что (builder! = null) оценка избыточна, потому что строитель всегда не равен нулю. Кажется, я не могу помочь вам в этом. –

+0

@ Sergey.quixoticaxis.Ivanov - спасибо. Я добавил примечание выше, что я вижу только проблему, если класс Builder находится в отдельном проекте для кода, который его вызывает. Параметры кода контракта одинаковы для каждого проекта. – Howard

+0

Привет, еще раз. Я переместил класс Builder в другую dll, и он по-прежнему отлично подходит для меня: -/ На всякий случай, разрешил ли вам контракт Reference Assembly Assembly = Build для сборки с определением класса Builder? –

ответ

1

Как мы что вам нужно включить сборку ссылок на контракты с вкладки проекта CC, чтобы обеспечить кросс-проектный анализ («Контрактная сборка ссылок» = «Сборка»)

+0

Пробовал оба из них, спасибо; но ошибка остается. – Howard

+0

Это действительно странно, я скопировал ваш код в примерный проект консоли, и CC не дал мне никаких предупреждений. Я использовал сообщество VS2015 с последним обновлением CC. –

+0

Я сделал редактирование и добавил дополнительную информацию. – Howard

 Смежные вопросы

  • Нет связанных вопросов^_^