3
Скажем, у меня есть следующая иерархия классов:CodeContracts ложно флаги отсутствуют предпосылки, что существует уже в базовом конструкторе
public class FooBase
{
private readonly object _obj;
protected FooBase(object obj)
{
Contract.Requires(obj != null);
_obj = obj;
}
}
public class Foo : FooBase
{
public Foo(object obj) : base(obj)
{
}
}
Когда я компилирую, я получаю следующее CodeContracts ошибка для Foo
:
Error 12 CodeContracts: Missing precondition in an externally visible method. Consider adding Contract.Requires(obj != null); for parameter validation
ли есть ли способ заставить CodeContracts признать, что проверка уже происходит в базовом классе?
Я думаю, что сообщение точнее; вы не можете видеть базовый ctor, только подклассы, а подкласс ctor не имеет контракта. Я подозреваю, что это было бы одинаково, если бы вы вызывали базовый метод из общедоступного метода в подклассе. Методы не «наследуют» контракты. – Andy
У вас будет точка, если 'FooBase' имел конструктор без параметров. Но, учитывая, что это не так, невозможно, чтобы базовый конструктор 'Contract.Requires' не вызывался. Поэтому я возвращаюсь к своему первоначальному вопросу ... – ultra909
Но это не так, как работают контракты. Анализатор рассматривает только метод отдельно, он не учитывает другой метод, который он вызывает, когда он определяет предварительные и пост-условия. – Andy