为什么VS 2015允许用空格分隔属性,而VS 2017则不允许?

10

请看以下简单的代码。方法DoMyCode有两个属性应用于它,条目之间用空格分隔。

using System;

namespace AttributeSpaceTesting
{
    class Program
    {
        static void Main(string[] args) { }

        [Horse Cow]
        static void DoMyCode() { }
    }

    [AttributeUsage(AttributeTargets.Method)]
    class HorseAttribute : Attribute { }

    [AttributeUsage(AttributeTargets.Method)]
    class CowAttribute : Attribute { }
}

这是在VS 2015下使用.NET 4.6开发的。

如果在Visual Studio 2015(更新3)中运行此代码,将可以编译并且不会出现任何错误或警告。

然而,在Visual Studio 2017中运行完全相同的代码将会产生以下异常:

Syntax error, ',' expected

我了解为什么会出现这个错误。我认为你需要在属性项之间放置逗号。在C# 5规范的17.2节中:

属性段由一对方括号组成,方括号内是一个由逗号分隔的一个或多个属性的列表。

那么为什么这种语法在VS 2015中是合法的呢?


为了完整的背景信息,我正在尝试在我们团队的单元测试项目中使用VS 2017。我注意到有这样的代码行:

[Description(@"The Test Description")]
[TestCategory("Regression"), TestCategory("Module"), TestCategory("ModuleRegression") TestMethod]
public void TC_12345_VerifyTheThingWorks()
造成新版Visual Studio系统编译时出现语法错误。

11
这是一个错误而非功能,已经被修复。 - Hans Passant
因为VS15不应该允许这样做。 - Andrew
1个回答

11
感谢Hans Passant分享这些信息。
看起来这确实是与Roslyn编译器有关的错误。它报告于2016年10月,远晚于同年6月VS 2015的最后一个版本发布时间。
这个修复已经在Visual Studio 2017中得到了解决,这就是为什么这种语法现在被正确地报告为错误的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接