2015-05-27 4 views
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 признать, что проверка уже происходит в базовом классе?

+0

Я думаю, что сообщение точнее; вы не можете видеть базовый ctor, только подклассы, а подкласс ctor не имеет контракта. Я подозреваю, что это было бы одинаково, если бы вы вызывали базовый метод из общедоступного метода в подклассе. Методы не «наследуют» контракты. – Andy

+0

У вас будет точка, если 'FooBase' имел конструктор без параметров. Но, учитывая, что это не так, невозможно, чтобы базовый конструктор 'Contract.Requires' не вызывался. Поэтому я возвращаюсь к своему первоначальному вопросу ... – ultra909

+0

Но это не так, как работают контракты. Анализатор рассматривает только метод отдельно, он не учитывает другой метод, который он вызывает, когда он определяет предварительные и пост-условия. – Andy

ответ

0

К сожалению, нет. Ваш Foo вызывает FooBase (obj) без необходимости.

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) 
    { 
     Contract.Requires(obj != null); 
    } 
} 

был бы единственным способом устранить эту проблему.

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

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