Skip to content

MS_MSBuildCS1519

nishi_74322014 edited this page Aug 21, 2026 · 1 revision

ビルド時に「error CS1519 Unexpected symbol 'xxxxx' in class, struct, or interface member declaration.」が発生

概要

auto-implemented propertyのあるプロジェクトを
MSBuildでビルドしようとしたら error CS1519 が出た。

補足(症状の見分け方): CS1519 は本来
「構文エラー(予期しない記号)」を意味する汎用のエラーで、
通常はタイプミス
(括弧の閉じ忘れ、セミコロン欠落)で出る。

しかし、Visual Studio では通るのに MSBuild では出る場合、
原因は構文ではなく
**「コンパイラが古く、その C# 構文を知らない」**ことにある。

【新しい構文をコンパイラが知らない場合の見え方】

   public string Name { get; set; } = "既定値";
                                    ^
   → C# 6 を知らないコンパイラには、ここが「予期しない記号」に見える
   → CS1519

同じソースで、環境によって結果が変わる——これが判別の鍵である。

詳細

  • auto-implemented propertyは、C# version 6 から利用可能。

  • MSBuildを使用して、C# version 6 としてコンパイルするには、
    Microsoft.Net.Compilers が必要になるケースがある。

Install-Package Microsoft.Net.Compilers

※ ただ、MSBuild のバージョンを、15 以上にする必要があるケースがある。

移行メモ(用語の補足): 原文の「auto-implemented property」は、
C# 3.0 からある自動実装プロパティ{ get; set; })そのものではなく、
C# 6.0 で追加された「自動実装プロパティの初期化子」
{ get; set; } = 値;)や
getter のみの自動実装プロパティを指していると読める
(これらが C# 6 以降の機能であるため)。

補足(なぜコンパイラが古いのか): MSBuild
C# コンパイラ(csc.exe)を呼び出すだけで、
どの csc.exe を使うかは環境で決まる

【古い経路】
   C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
     → C# 5 相当。Roslyn 以前のコンパイラ

【新しい経路】
   <VS インストール先>\MSBuild\Current\Bin\Roslyn\csc.exe
     → Roslyn。C# 最新版に対応

MSBuild 14.0(VS 2015)以前は前者を呼ぶことがあり、
C# 6 の構文で CS1519 が出る
原文の「MSBuild のバージョンを 15 以上にする必要がある」は
まさにこの点を指しており、正しい。

Microsoft.Net.Compilers パッケージは、
Roslyn コンパイラをプロジェクトに同梱して、
MSBuild にそれを使わせる
ためのものである。

packages\Microsoft.Net.Compilers.x.y.z\tools\csc.exe
  → .props / .targets が MSBuild の CscToolPath を書き換える
  → 環境の MSBuild が古くても、新しい C# でコンパイルできる

補足(現在の対処/最新化): Microsoft.Net.Compilers
非推奨であり、現在は使うべきではない。

パッケージ 現況
Microsoft.Net.Compilers 非推奨(.NET Framework 版 csc の同梱)
Microsoft.Net.Compilers.Toolset 後継。ビルド環境を固定したい場合のみ

通常は、ビルド環境側を新しくするのが正しい対処である。

対処 内容
① ビルド サーバーの VS / Build Tools を更新 最も確実。MSBuild 15 以上(VS 2017+)
dotnet build を使う .NET SDK 同梱の Roslyn が使われる
LangVersion を明示する 使う C# 版を固定して事故を防ぐ
Microsoft.Net.Compilers.Toolset CI で版を固定したい場合のみ
<PropertyGroup>
  <!-- 使用する C# のバージョンを明示する -->
  <LangVersion>latest</LangVersion>
</PropertyGroup>

LangVersion を明示しておくと、
「環境によって使える構文が違う」という事態を早期に検出できる
(古いコンパイラでは、そもそも LangVersion の指定でエラーになる)。

なお、SDK スタイル プロジェクトでは既定で新しい Roslyn が使われるため、
本エラーは発生しない。
packages.config + 旧形式 .csproj
古いビルド サーバーでビルドしている場合に限った問題である。

補足(切り分けの手順): CS1519 が出たら、次の順で確認する。

① Visual Studio ではビルドできるか?
      できない → 本当に構文エラー(ソースを直す)
      できる   → 環境差。②へ

② どの csc.exe が使われているか?
      msbuild Foo.sln -v:d | findstr /i "csc.exe"

③ MSBuild のバージョンは?
      msbuild -version
      → 15.0 未満なら、ビルド環境の更新を検討
# 使われている MSBuild を特定する(vswhere)
& "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" `
    -latest -requires Microsoft.Component.MSBuild `
    -find MSBuild\**\Bin\MSBuild.exe

詳細は MSBuild の「MSBuild の場所」に関する記述を参照。

参考

Microsoft Learn


Tags: 移行, テスト, デバッグ, デプロイ, .NET開発

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally