注
この記事は機能仕様です。 仕様は、機能の設計ドキュメントとして機能します。 これには、提案された仕様の変更と、機能の設計と開発時に必要な情報が含まれます。 これらの記事は、提案された仕様の変更が最終決定され、現在の ECMA 仕様に組み込まれるまで公開されます。
機能の仕様と完成した実装の間には、いくつかの違いがある可能性があります。 これらの違いは、関連する 言語設計会議 (LDM) ノートでキャプチャされます。
機能仕様を C# 言語標準に導入するプロセスの詳細については、仕様に関する記事を参照してください。
チャンピオン号: https://github.com/dotnet/csharplang/issues/275
概要
ラムダと匿名メソッドに対して 'static' 修飾子を許可します。これにより、ローカルまたはインスタンスの状態のキャプチャにスコープが含まれるのを禁止します。
モチベーション
外側のコンテキストから誤って状態をキャプチャしないようにします。その結果、キャプチャされたオブジェクトが予期せず保持されたり、予期しない追加の割り当てが発生したりする可能性があります。
詳細な設計
ラムダメソッドまたは匿名メソッドには、 static 修飾子を指定できます。
static修飾子は、ラムダメソッドまたは匿名メソッドが静的匿名関数であることを示。
静的匿名関数は、外側のスコープから状態をキャプチャできません。
その結果、外側のスコープからのローカル、パラメーター、および this は、 静的匿名関数内では使用できません。
静的匿名関数は、暗黙的または明示的なthisまたはbase参照からインスタンス メンバーを参照できません。
静的匿名関数は、外側のスコープstaticメンバーを参照できます。
静的匿名関数は、外側のスコープからconstant定義を参照できます。
nameof()
静的匿名関数では外側のスコープからローカル、パラメーター、またはthisまたはbaseを参照できます。
外側のスコープ内の private メンバーのアクセシビリティ規則は、 static と非static 匿名関数で同じです。
静的匿名関数定義がメタデータ内のstatic メソッドとして出力されるかどうかについては保証されません。 これは最適化するためにコンパイラの実装に任されています。
非static ローカル関数または匿名関数は、外側の 静的匿名関数から状態をキャプチャできますが 外側の静的匿名関数の外部の状態 キャプチャすることはできません。
有効なプログラムの匿名関数から static 修飾子を削除しても、プログラムの意味は変わりません。
C# feature specifications