如何指定等同于/ 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"); } } }
方法M
和L
都有严重的问题。
在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