Come specificare l’equivalente di / features: strict (di csc.exe) a msbuild.exe o nel file .csproj?

introduzione

Considera questa semplice (e ctriggers) class C #:

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"); } } } 

Entrambi i metodi M e L hanno problemi seri.

In M , chiediamo se un valore della struttura non nullable DateTime è uguale a null tramite l’operatore == sollevato (che esiste operator == overload DateTime operator == ). Questo cade sempre, e il compilatore può dire in fase di compilazione, quindi abbiamo un ramo ( "Yes" ) che non è raggiungibile.

In N chiediamo se o è un’istanza della static class Nullable che non può mai essere il caso (nota, la class statica Nullable non è la stessa della struct Nullable ). Ancora una volta, si tratta di un errore dello sviluppatore e l’affermazione "Yes" è irraggiungibile.

Vogliamo un avviso in fase di compilazione (o “avviso come errore”) in questi casi, giusto?

A quanto pare, attraverso l’accumulo graduale di errori e / o omissioni del compilatore nel vecchio compilatore C # utilizzato per C # da 1.0 a 5.0, gli avvisi di compilazione previsti non sono stati visualizzati con il vecchio compilatore. Fortunatamente ora abbiamo Roslyn / C # 6.0 / Visual Studio 2015 e aspettiamo di ricevere un avvertimento. Ma no, a causa del desiderio di non emettere avvisi da Roslyn che non sono presenti nei confronti del vecchio compilatore (compatibilità con le versioni precedenti?), Queste situazioni non sono ancora state messe in guardia.

Tuttavia, se si compila dalla riga di comando, con csc.exe , è ansible utilizzare:

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

e riceverai gli avvertimenti che vuoi! /features:strict fa csc.exe include avvertimenti che il vecchio compilatore C # “fogot”.

La mia domanda

Come si specifica l’equivalente di /features:strict alla msbuild.exe comando msbuild.exe o nel file .csproj ?

A volte, ad es. Quando abbiamo XAML nel nostro progetto di build, non è facile usare direttamente csc.exe , dobbiamo usare un file .csproj e compilarlo tramite msbuild.exe .

Questo flag è supportato direttamente nel file csproj, basta aggiungere:

 strict 

All’appropriato PropertyGroup nel tuo file csproj, e dopo la build vedrai questo avviso per il tuo codice:

Avviso CS8073 Il risultato dell’espressione è sempre ‘falso’ poiché un valore di tipo ‘DateTime’ non è mai uguale a ‘null’ di tipo ‘DateTime?’

Se vuoi fare lo stesso tramite l’interfaccia della riga di comando di msbuild, imposta questa proprietà con /p:Features=strict , come questo:

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