2013-04-22 10 views
6

SA1125: UseShorthandForNullableTypes hat diese Beschreibung (aus StyleCop 4.7 Editor Anwendungseinstellungen):SA1125: warum erzwingen "int?" im Gegensatz zu "Nullable <int>", aber nicht innerhalb von "typeof()"?

Erzwingt die Verwendung der Kurzschrift eines Nullable Types anstelle der Nullable<T> außer in einem typeof().

Gibt es einen Grund, warum es die Ausnahme für typeof() Aussage hat? typeof(int?) kompiliert genauso gut - ist das nur eine Vorliebe von StyleCop-Autoren oder gibt es eine tiefere Begründung?

bearbeiten: da die offizielle Dokumentation nicht über diese Ausnahme erwähnen, ich getestet, um den folgenden Code ein:

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

Ergebnis: nur die erste Zeile stellt sich die SA1125 Warnung.

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

+2

Wo finden Sie die Beschreibung, die Sie zitiert werden? Sicherlich nicht in dem von Ihnen bereitgestellten Link und auch nicht in der [offiziellen Dokumentation] (http://www.stylecop.com/docs/SA1125.html) –

+0

Ich würde einen Fehler vielleicht vorschlagen, oder eine verpasste Anforderung. ReSharper fordert mich auf, 'Nullable ' als 'int?' Auch in 'typeof()' neu zu schreiben. –

+0

Ich habe die Beschreibung im StyleCop Einstellungs-Editor gefunden. Jetzt ist die Frage, ob es genau ist ... –

Antwort

0

Meine Meinung ist, dass dies höchstens ein Fehler ist, zumindest ein vermisstes Verhalten. Der Code lautet:

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

Welche sieht aus wie es versucht, Nullable<> innerhalb von typeof(Nullable<>) zu unterstützen. Die Überprüfung auf TypeofExpression filtert jedoch unbeabsichtigt geschlossen Generika ohne ersichtlichen Grund.

Suchen Sie nach CheckShorthandForNullableTypes:

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

3

Während ich weiß nicht wirklich den Grund (wie ich nicht der Entwickler dieser Regel bin), ich vermute, dass es auf diese Weise entwickelt, um nicht eine Warnung für diese zu erzeugen spezifische Nutzung von typeof:

typeof(Nullable<>) 

aber sagen, dass, wenn dies der eigentliche offizielle Grund ist, sie hard die Ausnahme für diese besondere Verwendung anstelle des Schreibens eine Ausnahme für alle Verwendungen von typeof(Nullable<X>) haben könnte.

Beachten Sie, dass dies alles nur Annahmen sind.


EDIT Vom source code of Stylecop:

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

Also von dem, was ich verstehe, suchen die grundsätzlich für Langschrift generische Typen und den Spezialfall Nullable<> handhaben, dass sie erlauben, weil nicht da ist Kurzschrift dafür verfügbar. AFAIK, Nullable<> macht nur Sinn im Zusammenhang mit typeof(), also ich vermute, dass sie die Ausnahme für diesen Fall gemacht haben.

+1

+1 Der offene generische Fall macht Sinn. Gute Idee! –

+0

Die IL ist auch das gleiche für die 'Nullable ' vs 'int?' Wie Sie erwarten, also würde ich sagen, das ist ein Fehler oder eine verpasste Anforderung, wahrscheinlich wegen der Open-Generics-Unterstützung in 'typeof () '. –

+0

@AdamHouldsworth: Warum erwähnen Sie die generierte IL? Das ist nicht der Punkt hier. Weil der C# -Compiler 'int?' Durch 'Nullable ' ersetzt, wie könnte die erzeugte IL * anders * sein? Der Punkt hier ist über die StyleCop-Regel. Und was genau sehen Sie hier als Fehler oder verpasste Anforderung? –

Verwandte Themen