Funkcje języka C # 6.0 nie działają z programem Visual Studio 2015

135

Testuję program Visual Studio 2015 z C # 6.0, ale funkcje językowe nie działają. W aplikacji internetowej MVC kompiluje się następujący kod:

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

Jednak po uruchomieniu aplikacji za pośrednictwem Debug i IIS Express pojawia się następujący błąd:

CS1525: Nieprawidłowy termin wyrażenia „.”

Jak włączyć te funkcje?

Chris Schiffhauer
źródło
1
Wygląda na to, że jest specyficzny dla MVC (lub przynajmniej specyficzny dla ASP.NET), więc dodałem tag - ponieważ sam Visual Studio wyraźnie wie o C # 6 ... powinieneś spojrzeć na to, gdzie konfigurujesz MVC pod względem wersji .NET jest przeznaczony dla ... możliwe, że jest tam coś, co pozwoli ci określić kompilator do użycia.
Jon Skeet
Może musisz dodać compilerelement dla Roslyn codeprovider msdn.microsoft.com/en-us/library/y9x69bzw(v=vs.110).aspx w pliku web.config?
odnowienie
Czy ten kod znajduje się na stronie aspx lub stronie Razor? lub kod znajdujący się w pliku .cs?
Erik Funkenbusch
@ErikFunkenbusch Jest na stronie Razor.
Chris Schiffhauer
1
Tak, MVC5 nie jest kompatybilny z Roslyn
Erik Funkenbusch

Odpowiedzi:

209

Działa to w MVC 5 (testowane 5.2.3), wystarczy dodać pakiet Roslyn code dom Nuget

Dostawcy CodeDOM dla kompilatora .NET ...

Zastępcy dostawcy CodeDOM, którzy używają nowego kompilatora .NET Compiler Platform („Roslyn”) jako usług API. Zapewnia to obsługę nowych funkcji językowych w systemach używających CodeDOM (np. Kompilacja środowiska uruchomieniowego ASP.NET), a także poprawia wydajność kompilacji tych systemów.

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

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

jbtule
źródło
4
Należy to przesłać jako odpowiedź, ponieważ rozwiązuje to problem, zamiast konieczności aktualizacji do wersji beta MVC.
Daniel Eugen,
3
@Deef nie masz racji. W Microsoft.Net.Compilers jest związane z MSBuild. że dostawcy CodeDOM jest powiązany z ASP.NET i inne API, które kompilacji w czasie wykonywania.
jbtule
1
Tak, masz rację. Źle odczytałem / źle zinterpretowałem, ponieważ czasami zastępują pakiety nowymi nazwami i po prostu dodają je jako zależności.
David De Sloovere
21
Warto wspomnieć o ponownym uruchomieniu programu Visual Studio. Po zainstalowaniu pakietu wciąż narzekał, ale ponowne uruchomienie sprawiło, że
zniknął
1
@Rono, upewnij się, że źródło pakietu to nuget.org. Jak widać z linku, jest to poprawna nazwa, a pakiet istnieje.
jbtule
17

Cóż, mam MVC5 i ostatnio zainstalowałem VS 2015.

Zainstalowałem pakiet dostawców CodeDOM, ale to nie pomogło ... Ale potem zdałem sobie sprawę, że ten pakiet obsługuje tylko framework 4.5, podczas gdy mam ustawiony framework docelowy na 4.6 podczas testów - działa jednak z 4.5 ...

Dlatego zwróć także uwagę na ramy docelowe. Jeśli masz 4.5 - po prostu zainstaluj pakiet Microsoft.CodeDom.Providers.DotNetCompilerPlatform. Ale jeśli masz 4.5.1-4.6 jako cel, będziesz musiał zmienić w sekcji 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>

W przypadku C # po prostu zmień typ na:

type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
Sergey Kljopov
źródło
To z pewnością pomogło mi w rozpoczęciu C# 6pracy ASP.NET 4.6, ale lepiej byłoby umieścić kod z poprawnym typejuż tam ...
Serj Sagan
Dzięki, to działało, kiedy wracałem do domu we wtorek, a potem nie działało, kiedy wracałem w czwartek. W jakiś sposób ta sekcja konfiguracji poszła na AWOL, ponieważ pamiętam, że widziałem ją, kiedy pierwotnie ją uruchamiałem!
Carl
16

Miałem ten sam problem w programie Visual Studio 2015. Inna odpowiedź dotyczyła zastosowanego przeze mnie rozwiązania, ale nieprawidłowo określili poprawkę i nigdy nie podali wyjaśnienia.

W menu programu Visual Studio wybierz pozycję projekt i powinieneś zobaczyć element podrzędny Włącz C # 6 / VB 14, jeśli masz ten problem. Wybierz tę pozycję menu. Pobierze odpowiednie pakiety z Nuget i zainstaluje je. Następnie uruchom ponownie program Visual Studio i ponownie załaduj rozwiązanie.

Nie mogę sprawdzić, czy to również naprawi wybór opcji Project Properties> Build> Advanced> Language Version na C # 6 , więc możesz chcieć to również sprawdzić po włączeniu C # 6 z menu.

Tom K.
źródło
2
Ta pozycja nie znajduje się w moim menu projektu. Mam Unity 5.5.2, który otworzył moją społeczność VS 2015 do tworzenia skryptów. Po dodaniu wartości domyślnej do właściwości, błąd kompilatora pokazany przez czerwony unline, stwierdzający, że potrzebuję C # 6, ponieważ C # v.4 jest aktualnie załadowany. Za każdym razem, gdy próbuję wybrać właściwości projektu, ekran po prostu miga, ale nie pojawia się żadna strona.
Edward
15

Sprawdź właściwości projektu, przejdź do kompilacji, zaawansowanych i sprawdź, czy C # 6.0 nie jest ustawiony jako domyślny.

Obecnie istnieje doskonałe wsparcie dla MVC5 i C # 6.0 i działa zadziwiająco dobrze!

Bart Calixto
źródło
18
„Funkcja„ operator propagujący wartość null ”nie jest dostępna w języku C # 5. Użyj wersji językowej 6 lub nowszej.” nie wiedziałem o ustawieniach zaawansowanych, ale wydaje się, że tutaj nie działa.
JuFo
3
Jak zmienić domyślną wersję na 6, żeby nie musieć jej ustawiać w każdym projekcie?
Mir,
3
zdefiniować „niektóre”. to nie działa w porównaniu z aktualizacją 3 z 2015 roku.
Robert Ivanc
1
Kiedy dotarłem do właściwości projektu, nie otrzymałem menu kompilacji. Jeśli przejdę do „Strony właściwości”, pojawi się menu budowania, ale nie mam przycisku „Zaawansowane” na ekranie kompilacji. Tłumaczenie: „To nie działa” (dla mnie)
Malcolm Anderson
Moja wersja VS to Community 2015 Update 3 (14.0.25431.01)
Malcolm Anderson
10

Uwzględniając zalecenia dotyczące instalowania najnowszej wersji, Microsoft.CodeDom.Providers.DotNetCompilerPlatformmusiałem również ustawić roota, Web.config system.codedom aby w końcu wszystkie błędy Visual Studio 2015zniknęły:

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

Teraz uruchom ponownie Visual Studioi to powinno wystarczyć.

Serj Sagan
źródło
6

Program Visual Studio 2015 wyświetli również Enable C#6 / VB 14w menu Projekt z wybraną witryną / aplikacją internetową ASP.NET.

To de facto zainstaluje Microsoft.CodeDom.Providers.DotNetCompilerPlatformi Microsoft.Net.Compilerszapakuje do twojego projektu i doda odpowiednie tagi do pliku web.config.

Visual Studio 2015 - włącz CS6 snipp

Michal Šuvada
źródło
1
która karta witryny? jeśli masz na myśli usługi / internet, nie ma tam takiej funkcji.
Robert Ivanc,
1
I Visual Studio, po wybraniu projektu witryny sieci Web karta Witryna sieci Web pojawia się obok karty Widok. Tam możesz znaleźć tę funkcję.
Michal Šuvada
1
Na razie zagłosowałem w dół, edytuj, aby wyjaśnić, co dokładnie masz na myśli, np. Dodając zrzut ekranu.
user247702
Próbuję rozwiązać problem ze stroną internetową, ale ta pozycja menu nie jest dla mnie dostępna. Należy pamiętać, że inne projekty inne niż internetowe w tym samym rozwiązaniu nie mają problemu z używaniem funkcji VB 14. Wszystkie są przeznaczone dla platformy .NET 4.7 i zainstalowałem kompilator 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+" />
JEuvin
źródło