CS0429 - 使用 MSBuild 4 而非 14 检测到无法访问的表达式代码

CS0429 - Unreachable expression code detected with MSBuild 4, but not 14

以下代码示例展示了我在 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 的特定版本是 4.6.1055.0 和 14.0.25420.1。

谁能解释这种差异,我会 like/expect 版本之间的警告保持一致?

可能相关的是csc.exe正在播放的版本

C:\Program Files (x86)\MSBuild.0\bin\csc.exe version 1.3.1.60616

相比于:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Csc.exe version 4.6.1055.0

以前版本的 C# 编译器报告此诊断是一个错误。这是编译器工程师过度概括语言规范要求的结果。参见 https://github.com/dotnet/roslyn/issues/16147

C# 语言规范要求编译器对无法访问的语句发出警告。但是C#语言没有"reachable expression"这个概念。可达性由语言规范仔细定义,但它是一个仅适用于语句而不适用于表达式的概念。较新的编译器将不再报告此错误,我们也没有计划重新引入它。