【问题标题】:CS0429 - Unreachable expression code detected with MSBuild 4, but not 14CS0429 - MSBuild 4 检测到无法访问的表达式代码,但不是 14
【发布时间】:2017-01-02 11:20:04
【问题描述】:

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

谁能解释这种差异,我希望/期望警告在版本之间保持一致?

可能相关的是正在运行的 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

【问题讨论】:

  • 有趣,出于好奇,如果单元测试根据 msdn 是静态的,是否有区别?
  • @JeremyThompson 不,结果是一样的,我只是从 msdn 的代码中得到了一些其他的 resharper 警告。

标签: c# msbuild roslyn


【解决方案1】:

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

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

【讨论】:

  • 谢谢尼尔,很遗憾,因为我发现警告很有用。
猜你喜欢
  • 2015-08-02
  • 2011-05-09
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多