可使用msbuild 14 / VS 2015干净构建的简单代码,但无法在msbuild 15 / VS 2017中编译

时间:2018-09-26 19:47:15

标签: c# visual-studio-2015 visual-studio-2017

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中的显示方式:

enter image description here

1 个答案:

答案 0 :(得分:3)

我相信它能够在msbuild14中进行编译是一个错误。

C#v5语言specification(第394页)指出:

  

属性在属性部分中指定。属性部分   由一对用逗号括起来的方括号组成   -一个或多个属性的分隔列表。在此类列表中指定属性的顺序以及   排列在同一程序实体上的部分,不是   重大。 例如,属性规范[A] [B],   [B] [A],[A,B]和[B,A]是等效的。

正式语法为:

enter image description here

您发布的语法[MyAttribute1 MyAttribute2]不被考虑。

所以,我认为这是一个可以编译的错误,他们在msbuild 15中对其进行了修复。