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:strict于msbuild.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)
| 归档时间: |
|
| 查看次数: |
538 次 |
| 最近记录: |