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

Jep*_*sen 5 c# msbuild roslyn c#-6.0 visual-studio-2015

介绍

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

  }
}
Run Code Online (Sandbox Code Playgroud)

这两种方法M,并L有严重的问题.

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

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

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

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

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

csc.exe /features:strict ... ...
Run Code Online (Sandbox Code Playgroud)

你会得到你想要的警告!/features:strict使得csc.exe包括警告,旧的C#编译器"fogot".

我的问题

如何指定等效/features:strictmsbuild.exe命令行将在.csproj文件?

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

Evk*_*Evk 10

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

<Features>strict</Features>
Run Code Online (Sandbox Code Playgroud)

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

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

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

/t:rebuild /p:Configuration=Debug /p:Platform=x64 /p:Features=strict
Run Code Online (Sandbox Code Playgroud)