Почему VS 2015 позволяет атрибуты разделены пробелами, а VS 2017 - нет?

Возьмите следующий простой код. Метод 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

Я понимаю, почему эта ошибка происходит. Я ожидаю, что вам понадобится запятая между элементами атрибута. В разделе 17.2 спецификаций С# 5:

Раздел атрибутов состоит из пары квадратных скобок, которые окружают список, разделенный запятыми одним или несколькими атрибутами.

Итак, почему этот синтаксис закончен в VS 2015?


Для полного контекста я экспериментирую с использованием VS 2017 в проектах моей команды unit test. Я заметил такие строки:

[Description(@"The Test Description")]
[TestCategory("Regression"), TestCategory("Module"), TestCategory("ModuleRegression") TestMethod]
public void TC_12345_VerifyTheThingWorks()

которые вызывают синтаксические ошибки при компиляции в новой системе Visual Studio.

Ответ 1

Благодаря Hans Passant, который поделился этой информацией.

Похоже, что это действительно было ошибка с компилятором roslyn. Это было сообщено в октябре 2016 года, а также после последнего выпуска VS 2015 в июне того же года.

Это исправление пробилось в Visual Studio 2017, поэтому этот синтаксис правильно сообщается как ошибка.