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"这个概念。可达性由语言规范仔细定义,但它是一个仅适用于语句而不适用于表达式的概念。较新的编译器将不再报告此错误,我们也没有计划重新引入它。
以下代码示例展示了我在 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"这个概念。可达性由语言规范仔细定义,但它是一个仅适用于语句而不适用于表达式的概念。较新的编译器将不再报告此错误,我们也没有计划重新引入它。