Fonctionnalités C # 6.0 ne fonctionnant pas avec Visual Studio 2015


135

Je teste Visual Studio 2015 avec C # 6.0 mais les fonctionnalités du langage ne fonctionnent pas. Dans une application Web MVC, le code suivant se compile:

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

Cependant, lorsque j'exécute l'application via Debug et IIS Express, j'obtiens l'erreur suivante:

CS1525: terme d'expression non valide «.»

Comment activer ces fonctionnalités?


1
Cela semble être spécifique à MVC (ou au moins spécifique à ASP.NET), j'ai donc ajouté une balise - car Visual Studio lui-même connaît clairement C # 6 ... vous devriez regarder partout où vous configurez MVC en termes de version de .NET il cible ... il est possible qu'il y ait quelque chose qui vous permette de spécifier le compilateur à utiliser.
Jon Skeet

Peut-être devez-vous ajouter un compilerélément pour le fournisseur de code roslyn msdn.microsoft.com/en-us/library/y9x69bzw(v=vs.110).aspx dans le web.config?
rene

Ce code se trouve-t-il dans une page aspx ou une page Razor? ou du code qui se trouve dans un fichier .cs?
Erik Funkenbusch

@ErikFunkenbusch C'est dans une page Razor.
Chris Schiffhauer

1
Ouais, MVC5 n'est pas compatible avec Roslyn
Erik Funkenbusch

Réponses:


209

Cela fonctionne dans MVC 5 (testé 5.2.3), il vous suffit d'ajouter le package roslyn code dom Nuget

Fournisseurs CodeDOM pour le compilateur .NET ...

Fournisseurs CodeDOM de remplacement qui utilisent le nouveau compilateur .NET Compiler Platform ("Roslyn") comme API de service. Cela fournit la prise en charge de nouvelles fonctionnalités de langage dans les systèmes utilisant CodeDOM (par exemple la compilation d'exécution ASP.NET) ainsi que l'amélioration des performances de compilation de ces systèmes.

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

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


4
Cela doit être soumis comme réponse, car cela résout le problème plutôt que de devoir passer à une version bêta de MVC.
Daniel Eugen

3
@Deef vous vous trompez. Les Microsoft.Net.Compilers est liée à MSBuild. les fournisseurs CodeDOM sont liés à ASP.NET et à d'autres API qui se compilent au moment de l'exécution.
jbtule

1
Oui vous avez raison. J'ai mal lu / mal interprété car ils répètent parfois les paquets avec de nouveaux noms et les ajoutent simplement en tant que dépendances.
David De Sloovere

21
Il peut être intéressant de mentionner le redémarrage de Visual Studio. Il a continué à se plaindre après avoir installé le paquet, mais un redémarrage l'a fait disparaître :)
Siewers

1
@Rono, assurez-vous que la source de votre paquet est nuget.org. Comme vous pouvez le voir sur le lien, c'est le nom correct et le package existe.
jbtule

17

Eh bien, j'ai MVC5 et VS 2015 récemment installé.

J'ai installé le package de fournisseurs CodeDOM, mais cela n'a pas aidé ... Mais après cela, j'ai réalisé que ce package ne prend en charge que le framework 4.5, alors que le framework cible est défini sur 4.6 pendant les tests - cela fonctionne avec 4.5 cependant ...

Faites donc également attention au cadre cible. Si vous avez 4.5 - installez simplement le package Microsoft.CodeDom.Providers.DotNetCompilerPlatform. Mais si vous avez 4.5.1-4.6 comme cible, vous devrez changer dans la section 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>

Pour C # , changez simplement le type en:

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

Cela m'a certainement aidé C# 6à travailler avec ASP.NET 4.6, mais il aurait peut-être été préférable d'afficher le code avec le bon typedéjà là ...
Serj Sagan

Merci, cela fonctionnait quand je suis rentré chez moi un mardi et ensuite n'a pas fonctionné quand je suis revenu le jeudi. D'une manière ou d'une autre, cette section de la configuration était devenue AWOL, parce que je me souviens l'avoir vue quand je la faisais fonctionner à l'origine!
Carl

16

J'avais ce même problème dans Visual Studio 2015. Une autre réponse ici faisait allusion à la solution que j'ai utilisée, mais ils ont incorrectement spécifié le correctif et n'ont jamais donné de clarification.

Dans le menu Visual Studio, sélectionnez Projet et vous devriez voir le sous-élément Activer C # 6 / VB 14 si vous rencontrez ce problème. Sélectionnez ce sous-élément de menu. Il téléchargera les packages corrects de Nuget et les installera. Après cela, redémarrez Visual Studio et rechargez votre solution.

Je ne peux pas vérifier si cela corrigera également la sélection de Propriétés du projet> Construire> Avancé> Version du langage sur C # 6 , vous pouvez donc vérifier cela également après avoir activé C # 6 dans le menu.


2
Ce sous-élément ne figure pas dans mon menu Projet. J'ai Unity 5.5.2 qui a ouvert ma communauté VS 2015 pour créer des scripts. Lors de l'ajout d'une valeur par défaut à une propriété, une erreur du compilateur a été affichée par la ligne rouge, indiquant que j'avais besoin de c # 6 car C # v.4 était actuellement chargé. Chaque fois que j'essaye de sélectionner les propriétés du projet, l'écran clignote mais aucune page ne s'affiche.
Edward

15

Vérifiez les propriétés de votre projet, accédez à la génération, aux avancées et voyez si C # 6.0 si vous ne l'avez pas par défaut.

Actuellement, il existe un support parfait pour MVC5 et C # 6.0 et fonctionne incroyablement bien!


18
"La fonctionnalité 'opérateur de propagation nul' n'est pas disponible en C # 5. Veuillez utiliser la version 6 ou supérieure du langage." ne connaissait pas le paramètre Avancé mais ne semble pas fonctionner ici.
juFo

3
Comment changer la version par défaut en 6 pour que je n'ai pas à la définir sur chaque projet?
Mir

3
définir "certains". cela ne fonctionne pas dans la mise à jour 3 vs 2015.
Robert Ivanc

1
Quand je suis arrivé aux propriétés du projet, je n'obtiens pas de menu de construction. Si je vais sur "Pages de propriétés", j'obtiens un menu de construction, mais je n'ai pas de bouton "avancé" sur l'écran de construction. Traduction, "Cela ne fonctionne pas" (pour moi)
Malcolm Anderson

Ma version VS est Community 2015 Update 3 (14.0.25431.01)
Malcolm Anderson

10

En suivant les conseils d'installation de la dernière version, Microsoft.CodeDom.Providers.DotNetCompilerPlatformj'ai également dû définir ma racine Web.config system.codedom sur cette option pour que toutes les erreurs Visual Studio 2015disparaissent:

  <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>

Maintenant, redémarrez Visual Studioet cela devrait le faire.


6

Visual Studio 2015 affichera également un Enable C#6 / VB 14dans le menu Projet avec un site Web / application Web ASP.NET sélectionné.

Cela installera de facto Microsoft.CodeDom.Providers.DotNetCompilerPlatformet les Microsoft.Net.Compilerspackages dans votre projet et ajoutera les balises appropriées dans le fichier web.config.

visual studio 2015 - activer l'extrait CS6


1
quel onglet de site Web? si vous voulez dire propriétés / web, il n'y a pas de telle fonctionnalité.
Robert Ivanc

1
Dans Visual Studio, lorsque vous sélectionnez un projet de site Web, l'onglet Site Web apparaît en regard de l'onglet Affichage. Vous y trouverez peut-être cette fonctionnalité.
Michal Šuvada

1
J'ai voté contre pour l'instant, veuillez modifier pour clarifier ce que vous voulez dire exactement, par exemple en ajoutant une capture d'écran.
user247702

J'essaie de résoudre le problème avec un site Web et cet élément de menu n'est pas disponible pour moi. Notez que les autres projets non Web de la même solution n'ont aucun problème à utiliser les fonctionnalités de VB 14. Ils ciblent tous .NET 4.7 et j'ai installé le compilateur 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+" />
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.