CS0429 - 使用MSBuild 4检测到无法访问的表达式代码,但不是14

时间:2016-12-29 11:45:33

标签: c# msbuild roslyn

以下示例代码演示了我在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

1 个答案:

答案 0 :(得分:1)

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

C#语言规范要求编译器为无法访问的语句生成警告。但是,C#语言没有“可达表达式”的概念。可达性由语言规范精心定义,但它是一个仅适用于语句而不适用于表达式的概念。较新的编译器将不再报告此错误,我们也没有计划重新引入它。