UfcppSample
UfcppSample copied to clipboard
LangVersion の話が変
https://ufcpp.net/study/csharp/cheatsheet/langversionoption/ の記述が変:
- msbuild の
<LangVersion>省略と<LangVersion>default</LangVersion>が違うという話がない- 前者は TargetFramework からの自動指定
- Roslyn のレイヤーには
csc /LangVersion:13みたいなのが具体的な数字が渡ってるはず
- Roslyn のレイヤーには
- 後者は Roslyn に
/LangVersion:defaultが渡る- これは今だと
/LangVersion:latestと同じになるはず?確か
- これは今だと
- 前者は TargetFramework からの自動指定
- Roslyn 側は Roslyn 側で、
defaultがlatestMajorからlatestに変わった or 変えるみたいな話と混同してそう- Visual Stduio 2017 時代(C# 7.x の頃)は 7.1 世代でも 7.2 世代でも明示的に
latest指定しないと C# 7.0 で止まってたはず
- Visual Stduio 2017 時代(C# 7.x の頃)は 7.1 世代でも 7.2 世代でも明示的に
もう経緯も覚えてないし、今現在だけの話にして、「古い挙動」は消した方がよさそう?
ただ、msbuild (dotnet build とかで csproj を読ませたときの挙動)から説明しないと、<LangVersion> 省略と <LangVersion>default</LangVersion> の挙動差に合理的な説明できない。
同様の理由でもう https://ufcpp.net/study/csharp/cheatsheet/ap_ver8/ の冒頭の「補足」は消す。
ついで? ちょっと前に discord に投稿したやつコピペ:
- TargetFrameworks で net9.0;netstandard2.0 とかだとバージョン指定入れておかないと割と困ったり。
- default と未指定が違うのは、msbuild のデフォルトと roslyn のデフォルトが違うから…
- First-class Span みたいなやべーやつが来ると「13固定」とかの需要が多少…
- latest は「手元だとうっかり .NET 10 SDK 入れちゃってて意図せず14になっちゃった。GitHub Actionコケる」が普通に起こり。
- 昔は msbuild 側のデフォルトも latestMajor だったはずだけど、破壊的変更耐性低いからやめようとなっており、今はもうむしろ latest/latestMajor は非推奨という姿勢のはず。
- field キーワードみたいな「C# 14 でキーワードになってるから LangVersion/TargetFramework 上げる前に変更しておいてね」警告を出す(.NET 10 SDK で TargetFramework net9.0 とか LangVersion 13 だとこの警告出せる)ために latest やめたはず。
- 「人柱は黙って LangVersion preview」でいいので latest の存在意義あんまりなかったり…
- 昔は「csproj 1個1個に LangVersion 入れるのしんどいわ。てか、毎年 grep LangVersion するのだるいわ」だったけど、今はまあ、Directory.build.props に1行書くだけなので…
※ ちょっと修正:
「C# 14 でキーワードになってるから LangVersion/TargetFramework 上げる前に変更しておいてね」警告は、 実際には「警告出す」じゃなくて「Analyzer でサジェスト → 自動 fix を提供」かも。
「昔は msbuild 側のデフォルトも latestMajor だったはず」も不正確で、「昔は msbuild 側では特殊なことせず roslyn への素通ししかしてない & その場合の roslyn 側 default が latestMajor だった」かな。
大幅改変して直した。 というかほぼ書き直した。