Подтвердить что ты не робот

Visual Studio 2015/С# 6/Roslyn не может компилировать комментарии XML в проекте PCL

Я только что установил новую версию Community Edition для Visual Studio 2015 (RTM), и я пытаюсь получить мой проект с открытым исходным кодом, работающий под VS2015 и С# 6.0.

Некоторые из моих .cs разделяются между проектами. Таким образом, я могу создать как версию PCL (с ограниченной функциональностью), так и полную версию основной библиотеки.

По какой-то причине, однако, некоторые файлы кода строятся правильно в полном проекте, но сбой при построении в проекте PCL (где все компилируется под С# 5 и Visual Studio 2013). Компилятор, похоже, не может разрешить cref в комментарии XML при создании версии PCL. Ниже приведен упрощенный пример кода, который не работает на моей машине:

/// <summary></summary>
public class A
{
    // Compile error on next line:
    /// <summary><see cref="Y(Type)"/>.</summary>
    public void X() { }

    /// <summary></summary>
    /// <param name="x"></param>
    public void Y(Type x) { }

    /// <summary></summary>
    /// <param name="i"></param>
    public void Y(int i) { }
}

Ошибка компиляции, которую я получаю:

CS1580 Недопустимый тип для параметра Тип в атрибуте cref XML comment: 'Y (Тип)' SimpleInjector.PCL

Странно, однако, что поддержка IntelliSense в комментариях XML (Wow! у нас есть IntelliSense в комментариях XML сейчас!) действительно работает, а метод Y(Type) можно выбрать в раскрывающемся списке. Но после его выбора генерируется ошибка компиляции (только в PCL).

Мой вопрос, конечно, как это исправить? Это общая проблема? Могла ли конфигурация проекта иметь какое-либо отношение к этому? Это известная ошибка?

4b9b3361

Ответ 1

Дэвид Кин, разработчик команды языков С#/VB, довольно быстро ответил на Твиттере и сделал некоторые исследования по этому вопросу. Он сообщил мне, что на самом деле это ошибка и известное ограничение в Рослине. После расследования он сообщил о проблеме на Github здесь и здесь.

В основном есть две проблемы, которые вместе заставили меня застрять:

  • cref для публичных членов становится неоднозначным, когда внутренний член также находится в сфере видимости. В случае Type, кажется, существует внутренний тип с именем Type, но отличается от общедоступного System.Type. Хотя этот внутренний тип Type не существует для моего кода, он существует для Roslyn, а Roslyn запутывается.
  • Сообщение об ошибке не содержит полностью квалифицированных ссылок в CS0419, чтобы сделать его менее запутанным. Поскольку в сообщении об ошибке просто указывается "Недопустимый тип для параметра" Тип в атрибуте XML-комментариев cref ", мне стало трудно угадать, какова была фактическая проблема.

Текущая работа для этой проблемы заключается в том, чтобы полностью квалифицировать типы, подобные этому:

/// <summary><see cref="Y(System.Type)"/>.</summary>
public void X() { }

Примечание. То же самое верно для Assembly. Вам нужно будет полностью квалифицировать этот тип как System.Reflection.Assembly.