以下示例代码演示了我在Visual Studio 2012和2015之间看到的差异(MSBuild 4和14)。它基于本文中的描述:
Compiler Warning (level 4) CS0429
namespace UnitTestProject1
{
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class UnitTest1
{
[TestMethod]
public void Test_CS0429()
{
if (false && ReturnTrue()) // CS0429
{
Assert.Fail();
}
}
static bool ReturnTrue(){return true;}
}
}
当我使用MSBuild 4编译它时,我正确地得到警告CS0429,但是当我在MSBuild 14中编译相同的代码时,我没有收到警告。该行为在Visual Studio中是可重复的。
MSBuild I使用的特定版本是4.6.1055.0和14.0.25420.1。
任何人都可以解释这种差异,我希望/期望警告在版本之间保持一致吗?
可能相关的是正在播放的csc.exe版本
C:\ Program Files(x86)\ MSBuild \ 14.0 \ bin \ csc.exe版本1.3.1.60616
与:
相比C:\ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ Csc.exe版本4.6.1055.0
答案 0 :(得分:1)
以前版本的C#编译器报告此诊断是一个错误。这是编译器工程师过度概括语言规范要求的结果。见https://github.com/dotnet/roslyn/issues/16147
C#语言规范要求编译器为无法访问的语句生成警告。但是,C#语言没有“可达表达式”的概念。可达性由语言规范精心定义,但它是一个仅适用于语句而不适用于表达式的概念。较新的编译器将不再报告此错误,我们也没有计划重新引入它。