¿Cómo especificar el equivalente de / features: strict (of csc.exe) a msbuild.exe o en el archivo .csproj?

Introducción

Considera esta clase de C # simple (y mala):

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

Ambos métodos M y L tienen serios problemas.

En M , preguntamos si un valor de la estructura DateTime no anulable es igual a nulo a través del operador levantado == (que existe desde la sobrecarga del operator == DateTime operator == ). Esto siempre cae, y el comstackdor puede decirlo en tiempo de comstackción, por lo que tenemos una twig ( "Yes" ) que es inalcanzable.

En N preguntamos si o es una instancia de la static class Nullable que nunca puede ser el caso (nota, la clase estática Nullable no es la misma que la estructura Nullable ). Nuevamente, esto es un error del desarrollador, y la statement "Yes" es inalcanzable.

Queremos una advertencia en tiempo de comstackción (o “advertencia como error”) en estos casos, ¿verdad?

Como parece, a través de la acumulación gradual de errores y / u omisiones del comstackdor en el antiguo comstackdor de C # que se usó para C # 1.0 a 5.0, las advertencias de tiempo de comstackción esperadas no aparecieron con el comstackdor anterior. Por suerte, ahora tenemos Roslyn / C # 6.0 / Visual Studio 2015 y esperamos recibir una advertencia. Pero no, debido al deseo de no emitir advertencias de Roslyn de que cuando no estaba presente con el comstackdor anterior (¿compatibilidad hacia atrás?), Estas situaciones aún no están advertidas.

Sin embargo, si comstack desde la línea de comandos, con csc.exe , puede usar:

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

y obtendrás las advertencias que quieras! /features:strict hace que csc.exe incluya advertencias de que el antiguo comstackdor de C # “fogot”.

Mi pregunta

¿Cómo especifico el equivalente de /features:strict a la línea de comandos msbuild.exe o en el archivo .csproj ?

A veces, por ejemplo, cuando tenemos XAML en nuestro proyecto de comstackción, no es fácil usar csc.exe directamente, tenemos que usar un archivo .csproj y comstackr a través de msbuild.exe .

Esta bandera es compatible con el archivo csproj directamente, solo agregue:

 strict 

Para el PropertyGroup apropiado en su archivo csproj, y después de la comstackción verá esta advertencia para su código:

Advertencia CS8073 El resultado de la expresión siempre es ‘falso’, ya que un valor del tipo ‘DateTime’ nunca es igual a ‘nulo’ del tipo ‘DateTime?’

Si desea hacer lo mismo a través de la interfaz de línea de comandos de msbuild, simplemente establezca esta propiedad con /p:Features=strict , de esta manera:

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