Тривиальный код, который собирается чисто с помощью msbuild 14 / VS 2015, но не компилируется в msbuild 15 / VS 2017 - PullRequest
0 голосов
/ 26 сентября 2018
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 голосов
/ 26 сентября 2018

Я считаю, что тот факт, что он смог скомпилироваться в msbuild14, является ошибкой.

Язык C # v5 спецификация (стр. 394) гласит:

Атрибуты указываются в разделах атрибутов.Раздел атрибутов состоит из пары квадратных скобок, которые окружают разделенный запятыми список одного или нескольких атрибутов.Порядок, в котором атрибуты указываются в таком списке, и порядок, в котором располагаются разделы, прикрепленные к одному и тому же объекту программы, не имеет значения. Например, спецификации атрибутов [A] [B], [B] [A], [A, B] и [B, A] эквивалентны.

Формальный синтаксис:

enter image description here

Синтаксис, который вы разместили, [MyAttribute1 MyAttribute2], не учитывается.

Итак, я полагаючто это была ошибка, которую он смог скомпилировать, и они исправили это в msbuild 15.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...