如何指定等同于/ features:strict(of csc.exe)到msbuild.exe或.csproj文件?

介绍

考虑这个简单(和坏)的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"); } } } 

方法ML都有严重的问题。

M ,我们通过提升的==运算符(自DateTime重载operator ==存在)询问非可空结构DateTime是否等于null。 这总是下降,编译器可以在编译时告诉,因此我们有一个无法访问的分支( "Yes" )。

N我们询问o是否是static class Nullable一个实例,它永远不会是这种情况(注意,静态类Nullable与struct Nullable )。 同样,这是开发人员的错误,并且"Yes"语句无法访问。

在这些情况下,我们确实需要编译时警告(或“警告错误”),对吗?

看起来,通过在用于C#1.0到5.0的旧C#编译器中逐渐累积编译器错误和/或遗漏,预期的编译时警告无法与旧编译器一起出现。 幸运的是,我们现在有Roslyn / C#6.0 / Visual Studio 2015,并希望得到警告。 但是,不,因为希望不从Roslyn发出警告,即旧编译器不存在(向后兼容性?),这些情况仍然没有被警告。

但是,如果从命令行编译,使用csc.exe ,则可以使用:

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

你会得到你想要的警告! /features:strict使csc.exe包含警告,即旧的C#编译器“fogot”。

我的问题

如何指定等效的/features:strict to msbuild.exe命令行 .csproj文件?

有时,例如,当我们在构建项目中使用XAML时,直接使用csc.exe并不容易,我们必须使用.csproj文件并通过msbuild.exe编译。

csproj文件直接支持此标志,只需添加:

 strict 

对于csproj文件中的相应PropertyGroup,在构建之后,您将看到代码的此警告:

警告CS8073表达式的结果始终为“false”,因为“DateTime”类型的值永远不会等于“DateTime”类型的“null”。

如果你想通过msbuild命令行界面做同样的事情,只需用/p:Features=strict设置这个属性,如下所示:

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