2013-04-22 33 views
6

SA1125: UseShorthandForNullableTypes ma ten opis (wzięte z StyleCop 4.7 Ustawienia aplikacji editor):SA1125: dlaczego egzekwować "int?" w przeciwieństwie do "Nullable <int>", ale nie w "typeof()"?

wymusza stosowanie skrót typu wartości pustych aniżeli Nullable<T> wyjątkiem wewnątrz typeof().

Czy istnieje powód, dla którego ma wyjątek dla oświadczenia typeof()? typeof(int?) kompiluje się równie dobrze - czy jest to po prostu preferencja autorów StyleCop, czy istnieje głębsze rozumowanie?

Edit: skoro oficjalna dokumentacja nie wspominając ten wyjątek, testowałem następujący kod:

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

Wynik: tylko pierwsza linia podnosi ostrzeżenie SA1125.

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

+2

Gdzie można znaleźć opis jesteś powołując? Z pewnością nie w podanym linku, a także w [oficjalnej dokumentacji] (http://www.stylecop.com/docs/SA1125.html) –

+0

Sugerowałbym prawdopodobnie błąd lub nieudane wymagania. ReSharper prosi mnie o przepisanie 'Nullable ' jako 'int?' Nawet w 'typeof()'. –

+0

Znalazłem opis w edytorze ustawień StyleCop. Teraz pytanie brzmi, czy to jest dokładne ... –

Odpowiedz

0

Moim zdaniem jest to co najmniej błąd, a przynajmniej nieodebrane zachowanie. Kod stwierdza:

// 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)) 
    { 

który wygląda jak stara się wspierać Nullable<> wewnątrz od typeof(Nullable<>). Jednak sprawdzanie na TypeofExpression nieumyślnie odfiltrowuje generyczne typy bez wyraźnego powodu.

Look dla CheckShorthandForNullableTypes:

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

3

Chociaż właściwie nie znają powodu (jak nie jestem twórcą tej reguły), podejrzewam, że jest on zaprojektowany w taki sposób, aby nie generować ostrzeżenie dla tego specyficzne wykorzystanie typeof:

typeof(Nullable<>) 

w takiej sytuacji, jeżeli jest to rzeczywista oficjalny powód mogliby mieć hardcode wyjątek dla tego konkretnego użytkowania zamiast pisania wyjątek dla wszystkich zwyczajów typeof(Nullable<X>).

Należy pamiętać, że wszystkie powyższe to tylko supozycje.


EDIT Z source code of Stylecop:

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

Więc z tego co rozumiem, zasadzie szukać longhand typów generycznych, a uchwyt specjalny przypadek Nullable<> że pozwalają, bo tam nie ma skrót dostępny dla niego. AFAIK, Nullable<> ma sens tylko w kontekście typeof(), więc domyślam się, że zrobili wyjątek dla tej sprawy.

+1

+1 Otwarta skrzynka generyczna ma sens. Dobry pomysł! –

+0

IL jest również taki sam dla 'Nullable ' kontra 'int?' Jak można się spodziewać, więc powiedziałbym, że jest to błąd lub brakujące wymaganie, najprawdopodobniej z powodu otwartego wsparcia generycznego w 'typeof () '. –

+0

@AdamHouldsworth: Dlaczego wymieniasz wygenerowaną IL? Nie o to tutaj chodzi. Ponieważ kompilator C# zamienia 'int?' Na 'Nullable ' w jaki sposób wygenerowany IL może być * inny *? Chodzi tutaj o regułę StyleCop. I co dokładnie widzisz tutaj jako błąd lub brakujące wymaganie? –

Powiązane problemy