Visual Studio 2015/C#6/Roslyn无法在PCL项目中编译XML注释

Ste*_*ven 13 c# c#-6.0 visual-studio-2015

我刚刚安装了新版本的Visual Studio 2015社区版(RTM),我试图让我的开源项目在VS2015和C#6.0下运行.

我的一些.cs在项目中共享.这样我就可以构建PCL版本(功能有限)和核心库的"完整"版本.

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

/// <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) { }
}
Run Code Online (Sandbox Code Playgroud)

我得到的编译错误是:

CS1580参数的类型无效XML注释cref属性中的类型:'Y(Type)'SimpleInjector.PCL

奇怪的是,XML评论中的IntelliSense支持(哇!我们现在在XML评论中有智能感知!)实际上是可行的,并且该方法Y(Type)可以通过下拉列表进行选择.但选择此选项后,将生成编译错误(仅在PCL中).

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

Ste*_*ven 6

C#/ VB语言团队的开发人员David Kean在Twitter上做出了相当快的反应并对此做了一些研究.他向我报告说,这实际上是罗斯林的一个错误和已知限制.经过调查,他在这里这里报告了Github上的问题.

这里基本上有两个问题让我陷入困境:

  1. 当内部成员也在范围内时,公共成员的cref变得模棱两可.在这种情况下Type,似乎有一个内部类型Type,但不同于公众System.Type.虽然Type我的代码不存在这种内部类型,但它确实存在于Roslyn中,并且Roslyn感到困惑.
  2. 错误消息不包括CS0419中的完全限定引用,以减少混淆.因为错误消息只是声明"XML注释cref属性中的参数类型的无效类型",所以我很难猜出实际问题是什么.

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

/// <summary><see cref="Y(System.Type)"/>.</summary>
public void X() { }
Run Code Online (Sandbox Code Playgroud)

注意:同样适用Assembly.您必须完全符合该类型的资格System.Reflection.Assembly.