Acabo de instalar la Community Edition de Visual Studio 2015 (RTM) recién lanzada y estoy intentando que mi proyecto de código abierto funcione en VS2015 y C# 6.0.
Algunos de mis .cs se comparten entre proyectos. De esta forma, puedo crear tanto una versión PCL (con funcionalidad limitada) como una versión "completa" de la biblioteca central.
Sin embargo, por algún motivo, algunos archivos de código se compilan correctamente en el proyecto completo, pero fallan cuando se compilan en el proyecto PCL (donde todo se compila en C# 5 y Visual Studio 2013). Parece que el compilador no puede resolver una cref en un comentario XML al crear la versión PCL. Aquí hay un ejemplo de código simplificado que falla en mi máquina:
/// <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) { } }El error de compilación que estoy recibiendo es:
CS1580 Tipo de parámetro no válido Escriba en el atributo cref de comentario XML: 'Y(Type)' SimpleInjector.PCL
Sin embargo, lo extraño es que la compatibilidad con IntelliSense en los comentarios XML (¡Guau! ¡Ahora tenemos IntelliSense en los comentarios XML!) realmente funciona, y el método Y(Type) se puede seleccionar a través de la lista desplegable. Pero después de seleccionar esto, se genera un error de compilación (solo en PCL).
Mi pregunta, por supuesto, es ¿cómo solucionar esto? ¿Es este un problema común? ¿Podría la configuración del proyecto tener algo que ver con esto? ¿Es esto un error conocido?
David Kean , un desarrollador del equipo de lenguajes C#/VB, respondió bastante rápido en Twitter e investigó un poco sobre esto. Me informó que esto es, de hecho, un error y una limitación conocida en Roslyn. Después de la investigación, informó el problema en Github aquí y aquí .
Básicamente, hay dos problemas aquí que juntos causaron que me quedara atascado:
Type , parece que hay un tipo interno llamado Type , pero diferente al System.Type público. Aunque este Type de tipo interno no existe para mi código, sí existe para Roslyn, y Roslyn se confunde.La solución actual para este problema es calificar completamente los tipos como este:
/// <summary><see cref="Y(System.Type)"/>.</summary> public void X() { } Nota: Lo mismo vale para Assembly . Deberá calificar completamente ese tipo como System.Reflection.Assembly .