銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

ASP.NET Core 2.0 preview 2 では C# 7.1 の構文がRazor Viewの中で使えなかった話

このissueのやり取りがすべてなんですが、備忘録として残しておきます。

github.com

.NET Core 2.0 / ASP.NET Core 2.0のタイミングでC# 7.1が利用可能になる予定で、実際preview 2の時点で利用可能です。

blogs.msdn.microsoft.com

このブログには"Razor Support for C# 7.1"とあって<LangVersion>latest</LangVersion>をプロジェクトのプロパティにつけろと書いてありますが、Razor内に限らずC# 7.1の構文を利用するにはこのプロパティを追加しておく必要がありそうです。そもそもC# 7.1で追加される機能についてはこちらが詳しいです。

ufcpp.net

で、実際にRazorの中にC# 7.1の機能を使ったコードを書くとVisual Studio上でのコンパイルエラーは見えないし、ASP.NET Coreのアプリも起動まではするのですが、該当ページへアクセスしようとするとRazorがコンパイルできないというエラーが出ます。ASP.NET Core 2.0ではデフォルトのテンプレートで発行時のRazorコンパイルが有効になっているのですが、実際 dotnet publish するとその段階でコンパイルエラーを検出します。

で、冒頭のissueに戻るのですが、どうやらpreview 2のバグのようで、現在作業中のRTMでは修正済みとなっています。開発中のRTMを利用するには、まず.NET Core SDKをここからダウンロードしてインストールしたうえで、

github.com

ASP.NET Coreのパッケージをmyget経由でRTM版にアップデートします。具体的にはNuGet.configを追加して、

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <packageSources>
   <add key="dotnet-2-0-0-rtm" value="https://dotnet.myget.org/F/dotnet-2-0-0-rtm/api/v3/index.json" />
 </packageSources>
</configuration>

参照するパッケージをRTMにあげます。

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" />
  </ItemGroup>

これで<LangVersion>latest</LangVersion>と指定すればRazorの中でもC# 7.1の構文が使えるようになります。なお、<LangVersion>7.1</LangVersion>とバージョン番号を指定することもできるのですが、こちらはRTMでもバグが残っていて、これを回避するにはこのコメントにあるワークアラウンドを適用する必要があります。