2016-04-04 4 views
5

У меня есть кусок кода, который выглядит немного как это:CC Предложив Резервируемой обеспечивает

public TReturn SubRegion(TParam foo) 
{ 
    Contract.Requires(foo!= null); 
    Contract.Ensures(Contract.Result<TReturn>() != null); 

    if (!CheckStuff(foo)) 
     foo.Blah(); 
    return OtherStuff(foo); 
} 

CC дает мне предупреждение:

Предупреждение 301 CodeContracts: Рассмотрите возможность добавления договора постусловия. Обеспечивает (Contract.Result()! = Null); предоставить дополнительную документацию библиотечным клиентам

Это, очевидно, полностью избыточно! У меня есть несколько таких избыточных предупреждений, и это становится проблемой (реальные предупреждения зарываются в поток избыточных предложений).

Поэтому у меня есть два вопроса:

1) Могу ли я что-то отсутствую, что означает, что это не лишняя рекомендация? В этом случае, что мне нужно сделать, чтобы исправить это предупреждение?

2) В качестве альтернативы, если это просто причуда CCCheck и не может быть исправлена, как я могу скрыть или подавить это предупреждение?

N.b. На всякий случай, если вы думаете, что в моем примере отсутствует что-то важное, полный код - это метод SubRegionhere.

+2

Какую версию кодовых контрактов вы используете? –

+1

Глядя на ваш код, я думаю, что проблема еще ниже. В 'SubRegion' есть вызов' ConstructFromSlicePart', который, в свою очередь, имеет вызов 'Construct (IReadOnlyList shape)'. Внутри 'Construct' последняя строка' return default (TSection) '. Если 'TSection' является ссылочным типом, то метод возвращает null. Это может быть причиной, которая в конечном итоге проявляется в этом предупреждении. –

+0

Версия CC - 1.9.10714.2 - насколько я вижу, это последнее. re: construct, вы уверены, что не искали в классе контрактов? Единственная реальная реализация Construct такова: https://bitbucket.org/martindevans/base-citygeneration/src/0128578a6228487ac3d98398bf0c8ed8bb43d0f5/Base-CityGeneration/Elements/Building/Internals/Floors/Design/Region.cs?at=default&fileviewer=file -view-default # Region.cs-34, который, очевидно, никогда не возвращает null! – Martin

ответ

1

Что касается 2: documentation довольно хорошо, посмотрите на 6.6.10 Фильтрация Предупреждающие сообщения:

Поручить статический контракт проверки не испускают особый класс предупреждений для метода (тип, сборка), аннотировать метод (тип, сборка) с атрибутом:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", warningFamily)] 

, где warningFamily является одним из: Requires, Ensures, Invariant, NonNull, ArrayCreation, ArrayLowerBound, ArrayUpperBound, DivByZero, MinValueNegation.

При необходимости статический контролер контракта позволяет фильтровать одно предупреждающее сообщение (а не все семейство). Для этого вы можете аннотирования метод с атрибутом

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", warningFamily-ILOffset-MethodILOffset)] 

где warningFamily находится в выше, и ILOffset и MethodILOffset используются статической контракта проверки, чтобы определить точку программы предупреждения относится. Смещение может быть получено из статической проверки контрактов на , обеспечивающее включение -outputwarnmasks в записи «Пользовательские настройки» в панели VS. Проверьте окно сборки вывода для необходимой информации .

+1

Похоже, у нас нет никаких идей по поводу №1, поэтому я предполагаю, что это принимает принятый ответ! – Martin

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