Я расследую код Контракты и я реализации 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
- Я успешно использую кодовые контракты в других (нестроительных) областях проекта
Ну, я нахожусь в обновлении 3, а кодовые контракты не только проверил все нормально, но также дал мне предупреждение, что (builder! = null) оценка избыточна, потому что строитель всегда не равен нулю. Кажется, я не могу помочь вам в этом. –
@ Sergey.quixoticaxis.Ivanov - спасибо. Я добавил примечание выше, что я вижу только проблему, если класс Builder находится в отдельном проекте для кода, который его вызывает. Параметры кода контракта одинаковы для каждого проекта. – Howard
Привет, еще раз. Я переместил класс Builder в другую dll, и он по-прежнему отлично подходит для меня: -/ На всякий случай, разрешил ли вам контракт Reference Assembly Assembly = Build для сборки с определением класса Builder? –