2017-03-16 41 views
11

我查找了與此相關的其他問題,但沒有一個看起來與我正在尋找的東西相當。在ASP.NET MVC Core項目的View中使用C#7功能

我有一個運行在ASP.NET Core上的網站,其中包含VS2017中的新項目結構。使用C#7特性的代碼文件很好地編譯。但試圖在視圖中使用這些功能會導致一系列關於語法的錯誤。我嘗試安裝Roslyn,以便在編譯視圖時使用它,因爲我可以告訴C#7功能在Roslyn nuget軟件包2.x和更高版本中可用。但是現在我收到的反饋明確地說明了

錯誤CS8059:功能的'變量聲明'在C#6中不可用。請使用語言版本7或更高版本。

在過去,我會檢查web.config,但ASP.NET Core項目中沒有web.config,而是根目錄中幾乎空的web項目,以便從IIS處理請求。

我該如何表明我的視圖應該使用Roslyn進行編譯,因爲直到運行時纔會這樣做呢?至少我假設這會解決我的問題。

編輯: 這個問題不是重複的,就像我在開始時提到的那樣,我也尋找現有的問題。這是在編譯時在應用程序中特別啓用C#7功能,並且僅適用於ASP.NET應用程序。我正在使用ASP.NET Core,它沒有web.config及其中定義的任何編譯設置。此外,我試圖做的是在運行時編譯的視圖,並可能在不同的系統上。

解決方案:

任何有興趣,你必須羅斯林添加到您的項目(我知道),但你也必須給RazorViewEngineOptions配置爲使用指示的語言版本(默認值是6 )。我已經做到了這一點,但我沒有做到正確。我需要將WithLanguageVersion()的結果返回到ParseOptions的頂端以取代它們。

services.AddMvc().AddRazorOptions(options => options.ParseOptions = options.ParseOptions.WithLanguageVersion(LanguageVersion.CSharp7)); 
+1

[啓用C#7在一個asp.net應用程序]的可能的複製(http://stackoverflow.com/ question/42744689/enabling-c-sharp-7-in-a-asp-net-application) – uTeisT

+0

不是重複的,增加了細節爲什麼。 –

+0

您收到的錯誤消息表示編譯器已正確升級(新語法已被識別)。必須有一個/ langversion設置在ASP.Net Core中控制這個,但我不知道它在哪裏。抱歉。 –

回答

14

你能試試以下(通過在ASP.NET核心團隊鄉親推薦):

  1. 安裝Microsoft.CodeAnalysis.CSharp(2.0.0版本)和System.ValueTuple(版本4.3.0 )包
  2. 在啓動。CS,在ConfigureServices方法,剃刀配置通過執行使用C#7以下:

    services.AddMvc().AddRazorOptions(options => 
        options.ParseOptions = new CSharpParseOptions(LanguageVersion.CSharp7)); 
    
+0

我已經擁有了所有這些,但是我再次嘗試再次檢查以確保您的工作。在尋找差異之後,我發現你對'ParseOptions'的賦值工作正常,但是我對'ParseOptions.WithLanguageVersion()'的調用沒有。所以我去尋找實現(我愛這是所有開源)。原來'WithLanguageVersion()'根本不修改你現有的'ParseOptions',而是返回一個新的'CSharpParseOptions'。所以一旦我將它分配給'ParseOptions'屬性,它就可以正常工作。有點直觀,但它的作品。 :-) –

+0

感謝一幫幫忙! :-) –

+0

這也適用於命名元組嗎?我覺得它不會,當然,從我運行過的測試來看,它似乎就是這樣,因爲它引發了一個'RuntimeBinderException'。 –

1

所以我發現有暴露你的ConfigureServices()價格Call Call Call一些編譯選項。

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc().AddRazorOptions(x => x.ParseOptions.WithLanguageVersion(LanguageVersion.CSharp7)); 
} 

問題是LanguageVersion.CSharp7如果你不添加Roslyn會給出錯誤。所以我認爲這是必要的。

添加Roslyn後,一切都編譯好,但視圖仍然給出錯誤。

@{ 
    //My view code 
    string s = "1"; 
    int.TryParse(s, out int i); 
} 

因此,如果MVC公開可用於指定語言版本的RazorOptions,爲什麼它不被尊重?

+0

您需要使用 'services.AddMvc()AddRazorOptions(X => x.ParseOptions = x.ParseOptions.WithLanguageVersion(LanguageVersion.CSharp7));' 因爲你正在處理這裏的一成不變羅斯林:) – Suchiman

相關問題