Características de C # 6.0 que no funcionan con Visual Studio 2015


135

Estoy probando Visual Studio 2015 con C # 6.0 pero las características del lenguaje no funcionan. En una aplicación web MVC, se compila el siguiente código:

if (!string.IsNullOrWhiteSpace(Model.Profile?.TypeName))
{
    // More logic here...
}

Sin embargo, cuando ejecuto la aplicación a través de Debug e IIS Express, aparece el siguiente error:

CS1525: término de expresión no válido '.'

¿Cómo habilito estas funciones?


1
Esto suena como si fuera específico de MVC (o al menos específico de ASP.NET), así que agregué una etiqueta, porque Visual Studio sí sabe claramente sobre C # 6 ... debe mirar donde configure MVC en términos de la versión de .NET está apuntando ... es posible que haya algo allí que le permita especificar el compilador a usar.
Jon Skeet

¿Quizás necesite agregar un compilerelemento para el proveedor de códigos roslyn msdn.microsoft.com/en-us/library/y9x69bzw(v=vs.110).aspx en la web.config?
René

¿Es este código que está en una página aspx o Razor page? o código que está en un archivo .cs?
Erik Funkenbusch

@ErikFunkenbusch Está en una página de Razor.
Chris Schiffhauer

1
Sí, MVC5 no es compatible con Roslyn
Erik Funkenbusch

Respuestas:


209

Esto funciona en MVC 5 (probado 5.2.3), solo necesita agregar el código roslyn dom Nuget package

Proveedores de CodeDOM para el compilador .NET ...

Proveedores de CodeDOM de reemplazo que usan el nuevo compilador .NET Compiler Platform ("Roslyn") como API de servicio. Esto proporciona soporte para nuevas características de lenguaje en sistemas que usan CodeDOM (por ejemplo, compilación de tiempo de ejecución ASP.NET), así como mejorar el rendimiento de compilación de estos sistemas.

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform/


44
Esto debe enviarse como respuesta, ya que soluciona el problema en lugar de tener que actualizar a una versión beta de MVC.
Daniel Eugen

3
@Deef eres incorrecto. Los Microsoft.Net.Compilers se relaciona con MSBUILD. los proveedores de CodeDOM están relacionados con ASP.NET y otras API que compilan en tiempo de ejecución.
jbtule

1
Si, tienes razón. Leí / interpreté mal porque a veces vuelven a empacar paquetes con nuevos nombres y simplemente los agrego como dependencias.
David De Sloovere

21
Vale la pena mencionar reiniciar Visual Studio. Siguió quejándose después de instalar el paquete, pero un reinicio hizo que desapareciera :)
Siewers

1
@Rono, asegúrese de que la fuente de su paquete sea nuget.org. Como puede ver en el enlace, es el nombre correcto y el paquete existe.
jbtule

17

Bueno, tengo MVC5 y recientemente instalé VS 2015.

He instalado el paquete de proveedores de CodeDOM, pero no ayudó ... Pero después de eso me di cuenta de que ese paquete solo admite el marco 4.5, mientras que tengo el marco de destino establecido en 4.6 durante las pruebas, aunque funciona con 4.5 ...

Así que preste atención también al marco objetivo. Si tiene 4.5, simplemente instale el paquete Microsoft.CodeDom.Providers.DotNetCompilerPlatform. Pero si tiene 4.5.1-4.6 como objetivo, tendrá que cambiar en la sección web.config

  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701">
          <providerOption name="CompilerVersion" value="v4.0"/>
      </compiler>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>

Para C # , simplemente cambie el tipo a:

type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 

Esto ciertamente me ayudó a comenzar C# 6a trabajar ASP.NET 4.6, pero podría haber sido mejor publicar el código con el correcto typeya allí ...
Serj Sagan

Gracias, esto había estado funcionando cuando fui a casa un martes y luego no funcionó cuando regresé el jueves. De alguna manera, esta sección de la configuración se había perdido, ¡porque recuerdo haberla visto cuando la estaba haciendo funcionar originalmente!
Carl

16

Estaba teniendo este mismo problema en Visual Studio 2015. Otra respuesta aquí aludía a la solución que usé, pero especificaron incorrectamente la solución y nunca dieron aclaraciones.

En el menú de Visual Studio, seleccione Proyecto y debería ver el subelemento Habilitar C # 6 / VB 14 si tiene este problema. Seleccione este elemento secundario del menú. Descargará los paquetes correctos de Nuget y los instalará. Después de esto, reinicie Visual Studio y vuelva a cargar su solución.

No puedo verificar si esto también solucionará la selección de Propiedades del proyecto> Compilación> Avanzado> Versión de idioma en C # 6 , por lo que es posible que desee verificar esto también después de habilitar C # 6 desde el menú.


2
Este subelemento no está en mi menú Proyecto. Tengo Unity 5.5.2 que abrió mi comunidad VS 2015 para crear algunos scripts. Al agregar un valor predeterminado a una propiedad, se muestra un error del compilador con la línea roja, indicando que necesitaba C # 6 ya que C # v.4 estaba actualmente cargado. Cada vez que intento seleccionar las propiedades del proyecto, la pantalla parpadea pero no aparece ninguna página.
Edward

15

Verifique las propiedades de su proyecto, vaya a compilar, avanzado y vea si C # 6.0 si no lo tiene por defecto.

¡Actualmente hay un soporte perfecto para MVC5 y C # 6.0 y funciona increíblemente bien!


18
"La función 'operador de propagación nulo' no está disponible en C # 5. Utilice la versión de idioma 6 o superior". no sabía acerca de la configuración avanzada, pero no parece funcionar aquí.
juFo

3
¿Cómo se cambia la versión predeterminada a 6 para que no tenga que configurarla en cada proyecto?
Mir

3
define "algunos". esto no funciona en vs 2015 actualización 3.
Robert Ivanc

1
Cuando llegué a proyectar propiedades, no obtengo un menú de construcción. Si voy a "Páginas de propiedades" aparece un menú de compilación, pero no tengo un botón "avanzado" en la pantalla de compilación. Traducción, "Esto no funciona" (para mí)
Malcolm Anderson

Mi versión VS es Community 2015 Update 3 (14.0.25431.01)
Malcolm Anderson

10

Incluyendo seguir el consejo de instalar la última Microsoft.CodeDom.Providers.DotNetCompilerPlatformversión, también tuve que configurar mi raíz Web.config system.codedom para que finalmente todos los errores Visual Studio 2015desaparezcan:

  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>

Ahora reinicie Visual Studioy eso debería hacerlo.


6

Visual Studio 2015 también mostrará un Enable C#6 / VB 14en el menú Proyecto con un sitio web ASP.NET / aplicación web seleccionada.

Esto instalará de facto Microsoft.CodeDom.Providers.DotNetCompilerPlatformy los Microsoft.Net.Compilerspaquetes en su proyecto y agregará las etiquetas apropiadas al archivo web.config.

visual studio 2015 - habilitar cs6 snipp


1
¿Qué pestaña del sitio web? si te refieres a propiedades / web no hay tal característica allí.
Robert Ivanc

1
I Visual Studio, cuando selecciona algún proyecto de sitio web, la pestaña Sitio web aparece junto a la pestaña Ver. Allí puede encontrar esta función.
Michal Šuvada

1
He votado por ahora, edítelo para aclarar qué quiere decir exactamente, por ejemplo, agregando una captura de pantalla.
user247702

Estoy tratando de solucionar el problema con un sitio web, y ese elemento del menú no está disponible para mí. Tenga en cuenta que otros proyectos que no son de la Web en la misma solución no tienen problemas al usar las funciones de VB 14. Todos apuntan a .NET 4.7, e instalé el compilador CodeDom.
Andrew S

-1
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:7 /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:15 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.