Visual Studio 2015 / C# 6 / Roslyn 无法编译 XML 项目中的 XML 评论

Visual Studio 2015 / C# 6 / Roslyn can't compile XML comments in PCL project

我刚刚安装了 Visual Studio 2015 (RTM) 的最新发布的社区版,我正在尝试让 my open source project 在 VS2015 和 C# 6.0 下工作。

我的一些 .cs 跨项目共享。这样我就可以构建 PCL 版本(功能有限)和 'full' 版本的核心库。

然而,出于某种原因,某些代码文件在完整项目中构建正确,但在 PCL 项目中构建时失败(所有内容均在 C# 5 和 Visual Studio 2013 下编译)。在构建 PCL 版本时,编译器似乎无法解析 XML 注释中的 cref。这是一个在我的机器上失败的简化代码示例:

/// <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 Invalid type for parameter Type in XML comment cref attribute: 'Y(Type)' SimpleInjector.PCL

奇怪的是 XML 评论中的 IntelliSense 支持(哇!我们现在 XML 评论中有 IntelliSense!)确实有效,并且方法 Y(Type) 是可选的通过下拉列表。但是选择这个之后会产生编译错误(仅在PCL中)。

我的问题当然是如何解决这个问题?这是个常见的问题吗?项目的配置可能与此有关吗?这是已知错误吗?

David Kean, a dev on the C#/VB languages team, responded quite quickly on Twitter and did some research on this. He reported back to me that this is in fact a bug and known limitation in Roslyn. After investigation, he reported the problem on Github here and here.

这里基本上有两个问题一起导致我卡住了:

    当内部成员也在范围内时,
  1. cref 到 public 成员变得不明确。在 Type 的情况下,似乎有一个名为 Type 的内部类型,但不同于 public System.Type。尽管此内部 Type 类型在我的代码中不存在,但在 Roslyn 中却存在,Roslyn 感到困惑。
  2. 错误消息不包括 CS0419 中的完全限定引用,以减少混淆。因为错误消息只是指出 "Invalid type for parameter Type in XML comment cref attribute",所以我很难猜出实际问题是什么。

当前解决此问题的方法是像这样完全限定类型:

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

注:Assembly也是如此。您必须将该类型完全限定为 System.Reflection.Assembly.