2016-05-18 1 views
4

Einführung

Betrachten Sie diese einfach (und schlecht) Klasse C#:Wie wird das Äquivalent von/features: strict (von csc.exe) zu msbuild.exe oder in der .csproj-Datei angegeben?

using System; 

namespace N 
{ 
    static class C 
    { 
    static void M(DateTime d) 
    { 
     if (d == null) 
     Console.WriteLine("Yes"); 
     else 
     Console.WriteLine("No"); 
    } 

    static void L(object o) 
    { 
     if (o is Nullable) 
     Console.WriteLine("Yes"); 
     else 
     Console.WriteLine("No"); 
    } 

    } 
} 

Beide Methoden M und L ernsthafte Probleme haben.

In M, fragen wir, ob ein Wert der Nicht-Nullable-Struktur DateTime auf null über den angehobenen == Operator gleich ist (die seit DateTime Überlastungen existiert operator ==). Dies ist immer der Fall, und der Compiler kann zur Kompilierungszeit sagen, dass wir einen Zweig ("Yes") haben, der nicht erreichbar ist.

In N wir fragen, ob o eine Instanz der static class Nullable ist das nie der Fall sein kann (Anmerkung, die statische Klasse Nullable ist nicht das gleiche wie die Struktur Nullable<>). Auch dies ist ein Entwicklerfehler, und die "Yes"-Anweisung ist nicht erreichbar.

Wir wollen eine Kompilierung-Warnung (oder "Warnung als Fehler") in diesen Fällen, richtig?

Wie es scheint, durch allmähliche Anhäufung von Compiler-Fehlern und/oder Auslassungen im alten C# -Compiler, der für C# 1.0 bis 5.0 verwendet wurde, die erwarteten Kompilierungswarnungen nicht mit dem alten Compiler angezeigt werden. Zum Glück haben wir jetzt Roslyn/C# 6.0/Visual Studio 2015 und erwarten eine Warnung. Aber nein, wegen des Wunsches, keine Warnungen von Roslyn auszusenden, die bei dem alten Compiler nicht vorhanden waren (Rückwärtskompatibilität?), Wird diesen Situationen immer noch nicht gewarnt.

Wenn Sie jedoch über die Befehlszeile zu kompilieren, mit csc.exe, können Sie verwenden:

csc.exe /features:strict ... ... 

und Sie werden die Warnungen Sie erhalten! /features:strict macht csc.exe Warnungen enthalten, dass der alte C# -Compiler "fogot".

Meine Frage

Wie gebe ich das Äquivalent von /features:strict-msbuild.exe Befehlszeile oder in der .csproj-Datei?

Manchmal, z.B. Wenn wir XAML in unserem Build-Projekt haben, ist es nicht einfach, csc.exe direkt zu verwenden, wir müssen eine .csproj Datei verwenden und kompilieren durch msbuild.exe. in csproj Datei

+0

Wo ist '/ Features: strict' dokumentiert? Nicht auf https://msdn.microsoft.com/en-us/library/6ds95cz0.aspx ... –

+0

@KrisVandermotten Eine gute Frage. Ich weiß es nicht. Sie können selbst überprüfen, ob es funktioniert. Ich glaube, ich entdeckte das Feature, als ich zu einem Roslyn-Forum oder Roslyn Change Request geführt wurde, als ich das googelte. Ich erinnere mich nicht genau, wo das war. –

Antwort

7

Dieses Flag direkt unterstützt wird, fügen Sie einfach:

<Features>strict</Features> 

an den entsprechenden Property in Ihrer csproj-Datei, und nach dem Bauprozess wird diese Warnung für Ihren Code sehen:

Warnung CS8073 Das Ergebnis des Ausdrucks ist immer 'falsch', da ein Wert vom Typ 'DateTime' niemals gleich 'null' vom Typ 'DateTime' ist.'

Wenn Sie das gleiche über msbuild Kommandozeilen-Schnittstelle tun möchten, setzen Sie gerade diese Eigenschaft mit /p:Features=strict, wie folgt aus:

/t:rebuild /p:Configuration=Debug /p:Platform=x64 /p:Features=strict 
+0

Großartig, das funktioniert! Wenn dieses XML-Element in der Datei ".csproj" nicht vorhanden ist, kann ich dann noch eine Befehlszeilenoption für "msbuild.exe" angeben, die "features: strict" enthält? –

+1

@JeppeStigNielsen Ja sicher, siehe aktualisierte Antwort – Evk

+0

Und ist im Allgemeinen der Fall, auch wenn es in Projektdatei festgelegt ist, können Sie immer über die Befehlszeile überschreiben. –

Verwandte Themen