2013-04-22 3 views
6

SA1125: UseShorthandForNullableTypes имеет это описание (взятое из StyleCop 4.7 Настройки приложения редактора):SA1125: зачем применять «int?»? в отличие от «Nullable <int>», но не внутри «typeof()»?

навязывает использование стенографии из обнуляемого типа, а не Nullable<T> за исключением внутри typeof().

Есть ли причина, по которой у него есть исключение для заявления typeof()? typeof(int?) компилируется так же хорошо - это просто предпочтение авторов StyleCop или есть более глубокие рассуждения?

Редактировать: поскольку официальная документация не упоминает это исключение, я тестировал следующий код:

var x = new Nullable<int>(); 
var y = new int?(); 
var z = typeof(Nullable<int>); 
var v = typeof(int?); 

Результат: только первая линия поднимает предупреждение SA1125.

Edit 2: The work item for StyleCop asking to fix this behavior

+2

Где найти описание вы цитируете? Конечно, не в ссылке, которую вы предоставили, а также не в [официальной документации] (http://www.stylecop.com/docs/SA1125.html) –

+0

Я бы предположил ошибку или пропущенное требование. ReSharper предлагает мне переписать 'Nullable ' как 'int?' Даже в 'typeof()'. –

+0

Я нашел описание в инструменте редактора настроек StyleCop. Теперь вопрос в том, является ли он точным ... –

ответ

0

Мое мнение, что это, по крайней мере, ошибка, по крайней мере, пропущенное поведение. Код гласит:

// Check the declaration of the generic type for longhand, but allow Nullable<> which has no shorthand 
if (genericType.ChildTokens.Count > 0 && Utils.TokenContainNullable(genericType.ChildTokens.First)) 
{ 
    if (genericType.Parent == null || !(genericType.Parent is TypeofExpression)) 
    { 

который выглядит как будто он пытается поддержать Nullable<> внутри typeof(Nullable<>). Тем не менее, проверка на TypeofExpression непреднамеренно отфильтровывает закрыт дженерики без видимой причины.

Ищут CheckShorthandForNullableTypes:

http://stylecop.codeplex.com/SourceControl/changeset/view/249eed5b15ed#Project/Src/AddIns/CSharp/Analyzers/ReadabilityRules.cs

3

В то время как я на самом деле не знаю причину (так как я не разработчик этого правила), я подозреваю, что он разработан таким образом, чтобы не генерировать предупреждения для этого специальное использование typeof:

typeof(Nullable<>) 

это, как говорится, если это фактическая официальная причина, они могли бы жёстко исключение для этого конкретного использования вместо написания исключение для всех использований typeof(Nullable<X>).

Обратите внимание, что все это Предполагается, что только.


EDIT Из source code of Stylecop:

// Check the declaration of the generic type for longhand, but allow Nullable<> which has no shorthand 

Так от того, что я понимаю, в основном не искать обыкновенное письмо общих типов, а также обрабатывать особый случай Nullable<>, что они позволяют, потому что нет сокращенно доступный для него. AFAIK, Nullable<> имеет смысл только в контексте typeof(), поэтому я предполагаю, что они сделали исключение для этого случая.

+1

+1 Открытый общий случай имеет смысл. Хорошая идея! –

+0

ИЛ является тем же самым для 'Nullable ' vs 'int?', Как и следовало ожидать, поэтому я бы сказал, что это ошибка или пропущенное требование, скорее всего, из-за поддержки открытых дженериков в 'typeof () '. –

+0

@AdamHouldsworth: Почему вы упоминаете сгенерированный ИЛ? Здесь дело не в этом. Поскольку компилятор C# заменяет 'int?' На 'Nullable ', как может сгенерированный IL быть * другим *? Здесь речь идет о правиле StyleCop. И что именно вы видите здесь как ошибку или пропущенное требование? –