C # 6.0-Funktionen funktionieren nicht mit Visual Studio 2015


134

Ich teste Visual Studio 2015 mit C # 6.0, aber die Sprachfunktionen funktionieren nicht. In einer MVC-Webanwendung wird der folgende Code kompiliert:

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

Wenn ich die Anwendung jedoch über Debug und IIS Express ausführe, wird folgende Fehlermeldung angezeigt:

CS1525: Ungültiger Ausdrucksbegriff '.'

Wie aktiviere ich diese Funktionen?


1
Das klingt so, als wäre es MVC-spezifisch (oder zumindest ASP.NET-spezifisch), also habe ich ein Tag hinzugefügt - da Visual Studio selbst klar über C # 6 Bescheid weiß ... sollten Sie sich ansehen, wo immer Sie MVC in Bezug auf die Version konfigurieren von .NET zielt es ab ... es ist möglich, dass es etwas gibt, mit dem Sie den zu verwendenden Compiler angeben können.
Jon Skeet

Möglicherweise müssen Sie ein compilerElement für den Roslyn-Codeprovider msdn.microsoft.com/en-us/library/y9x69bzw(v=vs.110).aspx in der web.config hinzufügen?
Ren

Befindet sich dieser Code auf einer Aspx- oder Razor-Seite? oder Code, der in einer CS-Datei enthalten ist?
Erik Funkenbusch

@ErikFunkenbusch Es ist in einer Rasiermesserseite.
Chris Schiffhauer

1
Ja, MVC5 ist nicht Roslyn-kompatibel
Erik Funkenbusch

Antworten:


208

Dies funktioniert in MVC 5 (getestet 5.2.3). Sie müssen lediglich das Roslyn-Code-Dom-Nuget-Paket hinzufügen

CodeDOM-Anbieter für .NET Compiler ...

Ersatz-CodeDOM-Anbieter, die den neuen .NET Compiler Platform-Compiler ("Roslyn") als Service-APIs verwenden. Dies bietet Unterstützung für neue Sprachfunktionen in Systemen, die CodeDOM verwenden (z. B. ASP.NET-Laufzeitkompilierung), sowie eine Verbesserung der Kompilierungsleistung dieser Systeme.

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

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


4
Dies sollte als Antwort eingereicht werden, da es das Problem behebt, anstatt auf eine Beta-Version von MVC aktualisieren zu müssen.
Daniel Eugen

3
@Deef du bist falsch. Die Microsoft.Net.Compiler sind mit Msbuild verwandt. Die CodeDOM-Anbieter beziehen sich auf ASP.NET und andere APIs, die zur Laufzeit kompiliert werden.
jbtule

1
Ja, du hast recht. Ich habe falsch gelesen / falsch interpretiert, weil sie manchmal Pakete mit neuen Namen neu auflisten und sie einfach als Abhängigkeiten hinzufügen.
David De Sloovere

21
Es kann erwähnenswert sein, Visual Studio neu zu starten. Es beschwerte sich immer wieder, nachdem ich das Paket installiert hatte, aber ein Neustart ließ es verschwinden :)
Siewers

1
@ Rono, Stellen Sie sicher, dass Ihre Paketquelle ist nuget.org. Wie Sie dem Link entnehmen können, handelt es sich um den richtigen Namen, und das Paket ist vorhanden.
jbtule

17

Nun, ich habe MVC5 und vor kurzem VS 2015 installiert.

Ich habe das CodeDOM-Provider-Paket installiert, aber es hat nicht geholfen ... Aber danach wurde mir klar, dass dieses Paket nur Framework 4.5 unterstützt, während ich das Ziel-Framework während der Tests auf 4.6 gesetzt habe - es funktioniert jedoch mit 4.5 ...

Achten Sie also auch auf das Ziel-Framework. Wenn Sie 4.5 haben, installieren Sie einfach das Paket Microsoft.CodeDom.Providers.DotNetCompilerPlatform. Wenn Sie jedoch 4.5.1-4.6 als Ziel haben, müssen Sie im Abschnitt web.config Änderungen vornehmen

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

Ändern Sie für C # einfach den Typ in:

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

Dies hat mir sicherlich geholfen, mich C# 6an die Arbeit zu machen ASP.NET 4.6, aber es wäre vielleicht besser gewesen, den Code mit dem richtigen typebereits dort zu posten ...
Serj Sagan

Danke, das hatte funktioniert, als ich an einem Dienstag nach Hause ging und dann nicht funktionierte, als ich am Donnerstag zurückkam. Irgendwie war dieser Abschnitt der Konfiguration AWOL geworden, weil ich mich daran erinnere, ihn gesehen zu haben, als ich ihn ursprünglich zum Laufen brachte!
Carl

16

Ich hatte das gleiche Problem in Visual Studio 2015. Eine andere Antwort hier bezog sich auf die von mir verwendete Lösung, aber sie spezifizierten den Fix falsch und gaben nie Klarheit.

Wählen Sie im Menü Visual Studio die Option Projekt aus, und Sie sollten das Unterelement C # 6 / VB 14 aktivieren sehen, wenn Sie dieses Problem haben. Wählen Sie diesen Menüunterpunkt. Es werden die richtigen Pakete von Nuget heruntergeladen und installiert. Starten Sie anschließend Visual Studio neu und laden Sie Ihre Lösung neu.

Ich kann nicht überprüfen, ob dadurch auch die Auswahl von Projekteigenschaften> Erstellen> Erweitert> Sprachversion auf C # 6 korrigiert wird. Daher möchten Sie dies möglicherweise auch überprüfen, nachdem Sie C # 6 über das Menü aktiviert haben.


2
Dieser Unterpunkt befindet sich nicht in meinem Projektmenü. Ich habe Unity 5.5.2, das meine VS 2015-Community geöffnet hat, um einige Skripte zu erstellen. Beim Hinzufügen eines Standardwerts zu einer Eigenschaft wurde ein Compilerfehler angezeigt, der durch die rote Unline angezeigt wurde und besagte, dass ich c # 6 benötigte, da C # v.4 gerade geladen war. Jedes Mal, wenn ich versuche, Eigenschaften des Projekts auszuwählen, blinkt der Bildschirm nur, aber es wird keine Seite angezeigt.
Edward

15

Überprüfen Sie Ihre Projekteigenschaften, gehen Sie zu Build, Advanced und prüfen Sie, ob C # 6.0 nicht standardmäßig vorhanden ist.

Derzeit gibt es perfekte Unterstützung für MVC5 und C # 6.0 und funktioniert erstaunlich gut!


18
"Die Funktion 'Null-Propagierungsoperator' ist in C # 5 nicht verfügbar. Bitte verwenden Sie die Sprachversion 6 oder höher." wusste nichts über die erweiterte Einstellung, scheint aber hier nicht zu funktionieren.
JuFo

3
Wie ändere ich die Standardversion auf 6, damit ich sie nicht bei jedem Projekt festlegen muss?
Mir

3
definiere "einige". Dies funktioniert nicht in vs 2015 Update 3.
Robert Ivanc

1
Wenn ich zu Projekteigenschaften komme, erhalte ich kein Build-Menü. Wenn ich zu "Eigenschaftenseiten" gehe, wird ein Build-Menü angezeigt, aber auf dem Build-Bildschirm befindet sich keine Schaltfläche "Erweitert". Übersetzung, "Das funktioniert nicht" (für mich)
Malcolm Anderson

Meine VS-Version ist Community 2015 Update 3 (14.0.25431.01)
Malcolm Anderson

10

Einschließlich der Ratschläge zur Installation der neuesten Microsoft.CodeDom.Providers.DotNetCompilerPlatformVersion musste ich auch meine Wurzel darauf setzen Web.config system.codedom , um endlich alle Fehler Visual Studio 2015zu beseitigen :

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

Jetzt neu starten Visual Studiound das sollte es tun.


6

Visual Studio 2015 zeigt auch eine Enable C#6 / VB 14im Menü Projekt mit einer ausgewählten ASP.NET-Website / Webanwendung an.

Dadurch werden de facto Installationen Microsoft.CodeDom.Providers.DotNetCompilerPlatformund Microsoft.Net.CompilersPakete in Ihr Projekt integriert und entsprechende Tags in die Datei web.config eingefügt.

Visual Studio 2015 - CS6-Snipp aktivieren


1
Welche Website-Registerkarte? Wenn Sie Eigenschaften / Web meinen, gibt es dort keine solche Funktion.
Robert Ivanc

1
I Visual Studio: Wenn Sie ein WebSite-Projekt auswählen, wird die Registerkarte Website neben der Registerkarte Ansicht angezeigt. Dort finden Sie möglicherweise diese Funktion.
Michal Šuvada

1
Ich habe vorerst abgestimmt. Bitte bearbeiten Sie diese, um zu klären, was genau Sie meinen, z. B. indem Sie einen Screenshot hinzufügen.
user247702

Ich versuche, das Problem mit einer Website zu beheben, und dieser Menüpunkt ist für mich nicht verfügbar. Beachten Sie, dass andere Nicht-Web-Projekte in derselben Lösung keine Probleme mit der Verwendung von VB 14-Funktionen haben. Sie alle zielen auf .NET 4.7 ab, und ich habe den CodeDom-Compiler installiert.
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+" />
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.