Skip to content

Instantly share code, notes, and snippets.

@ufcpp
Created February 24, 2021 03:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ufcpp/a92e0133794777f2eab1ecadb23dab08 to your computer and use it in GitHub Desktop.
Save ufcpp/a92e0133794777f2eab1ecadb23dab08 to your computer and use it in GitHub Desktop.
C# 9.0 で普通にコンパイルできるコード。semantics なしで lexical な情報だけ見てるコード整形ツールとかでガチで困ってるらしい。
// record はキーワードの record が優先。
// この行の @ を外すとコンパイル エラー。
// これも「そうせざるを得なかった」みたいなノリで、できるのなら dynamic, var と同じ方針にする可能性もあった。
@record record = new record { };
// この2行はエラーにならない。
dynamic dynamic = new dynamic();
var var = new();
// この行も OK。
nameof nameof(nameof a) => nameof(a);
// さすがにこれだとコンパイルエラー。メソッド名の nameof よりも引数名の nameof の方が優先みたい。
//nameof nameof(nameof nameof) => nameof(nameof);
// これは OK。引数名の方の nameof が優先で、 結果は "s" じゃなくてデリゲートの戻り値。
// nameof 型、nameof メソッドがある状況下で nameof 演算子を呼ぶ手段はなさそう。
string s = "abc";
nameof m(System.Func<string, nameof> nameof) => nameof(s);
// この行もコンパイル エラー。
// string s2 = nameof(nameof);
// C# 9.0 では、 record を型名として使うと警告を出すようにした。
record record { }
// 既存の文脈キーワードは何も警告出さない。
// record と同じ処理に変えてもいいんじゃない?という話になってる。
// record では(原理的に破壊的に変更になってるけど実用上)誰も問題にしなかったし。
class dynamic { }
struct var { }
class nameof { }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment