using System;
namespace ConsoleApplication1
{
[AttributeUsage(AttributeTargets.Class)]
public class MyAttribute1 : Attribute
{
}
[AttributeUsage(AttributeTargets.Class)]
public class MyAttribute2 : Attribute
{
}
[MyAttribute1 MyAttribute2]
class Program
{
static void Main(string[] args)
{
}
}
}
请注意,应用于本程序的属性之间没有逗号。我惊讶地发现它可以与msbuild 14 / VS 2015一起编译,但是无法与msbuild 15 / VS 2017一起编译。
我的期望是看到两个版本都失败。
任何人都可以解释发生了什么事吗?
编辑1
以下是反射代码在Reflector中的显示方式:
答案 0 :(得分:3)
我相信它能够在msbuild14中进行编译是一个错误。
C#v5语言specification(第394页)指出:
属性在属性部分中指定。属性部分 由一对用逗号括起来的方括号组成 -一个或多个属性的分隔列表。在此类列表中指定属性的顺序以及 排列在同一程序实体上的部分,不是 重大。 例如,属性规范[A] [B], [B] [A],[A,B]和[B,A]是等效的。
正式语法为:
您发布的语法[MyAttribute1 MyAttribute2]
不被考虑。
所以,我认为这是一个可以编译的错误,他们在msbuild 15中对其进行了修复。