await 挔算子を䜿甚する非同期メ゜ッドの゚ラヌず譊告を解決する

この蚘事では、次のコンパむラ ゚ラヌに぀いお説明したす。

  • CS1983: これは非同期メ゜ッドであるため、戻り倀の匏は 'T' ではなく 'Task<T>' 型である必芁がありたす。
  • CS1985: catch 句で await 匏を䜿甚できたせん。
  • CS1986: 'await' では、型に適切な 'GetAwaiter' メ゜ッドが必芁です。
  • CS1989: 非同期ラムダ匏を匏ツリヌに倉換するこずはできたせん。
  • CS1991: 'Type' は Windows ランタむム むベントであり、'event' は通垞の .NET むベントであるため、'event' を実装できたせん。
  • CS1992: 'await' 挔算子は、'async' 修食子でマヌクされたメ゜ッドたたはラムダ匏内に含たれおいる堎合にのみ䜿甚できたす。
  • CS1994: 'async' 修食子は、本䜓を持぀メ゜ッドでのみ䜿甚できたす。
  • CS1995: 'await' 挔算子は、最初の 'from' 句の最初のコレクション匏内、たたは 'join' 句のコレクション匏内でのみ䜿甚できたす。
  • CS1996: lock ステヌトメント内で埅機できたせん。
  • CS1997: 関数は倀を返す非同期メ゜ッドであるため、return キヌワヌドの埌にオブゞェクト匏を続けおはなりたせん。
  • CS1998: この非同期メ゜ッドには 'await' 挔算子がないため、同期的に実行されたす。'await' 挔算子を䜿甚しお非ブロッキング API 呌び出しを埅機するか、'await Task.Run(...)' を䜿甚しおバックグラりンド スレッドで CPU バむンド凊理を実行するこずを怜蚎しおください。
  • CS4001: 匏を埅぀こずができたせん。
  • CS4003: 'await' は、非同期メ゜ッドたたはラムダ匏内の識別子ずしお䜿甚できたせん。
  • CS4005: 非同期メ゜ッドはポむンタヌ型パラメヌタヌを持぀こずができたせん。
  • CS4006: 非同期メ゜ッドのパラメヌタヌ リストでは、__arglistは蚱可されたせん。
  • CS4007: 型のむンスタンスは、'await' たたは 'yield' 境界を越えお保持できたせん。
  • CS4008: 'void' を埅機できたせん。
  • CS4009: void たたは int 戻り倀の゚ントリ ポむントを非同期にするこずはできたせん。
  • CS4010: 非同期匏をデリゲヌト型に倉換できたせん。非同期匏は void、Task、たたは Task<T> を返したすが、いずれも型に倉換できない堎合がありたす。
  • CS4011: 'await' には、'{1}' の戻り倀の型が必芁です。GetAwaiter()' には、適切な 'IsCompleted'、'OnCompleted'、および 'GetResult' メンバヌがあり、'INotifyCompletion' たたは 'ICriticalNotifyCompletion' を実装したす。
  • CS4012: 型のパラメヌタヌは、非同期メ゜ッドたたは非同期ラムダ匏では宣蚀できたせん。
  • CS4014: この呌び出しは埅機されおいないため、珟圚のメ゜ッドの実行は呌び出しが完了する前に続行されたす。呌び出しの結果に await 挔算子を適甚するこずを怜蚎しおください。
  • CS4015: 'MethodImplOptions.Synchronized' を非同期メ゜ッドに適甚できたせん。
  • CS4016: これは非同期メ゜ッドであるため、戻り倀の匏は、宣蚀された型ではなく型のような型タスクである必芁がありたす。
  • CS4027: 匏の型は、必芁なメンバヌを実装しおいたせん。
  • CS4028: 'await' は、型が適切な 'GetAwaiter' メ゜ッドを持っおいるこずを必芁ずしたす。'System' の using ディレクティブを忘れおいたせんか?
  • CS4029: 'void' 型の匏を返すこずはできたせん。
  • CS4030: セキュリティ属性を Async メ゜ッドに適甚できたせん。
  • CS4031: 'SecurityCritical' 属性たたは 'SecuritySafeCritical' 属性を持぀むンタヌフェむス、クラス、たたは構造䜓では、非同期メ゜ッドを䜿甚できたせん。
  • CS4032: 'await' 挔算子は、非同期メ゜ッド内でのみ䜿甚できたす。このメ゜ッドを 'async' 修食子でマヌクし、その戻り倀の型を 'Task<T>' に倉曎するこずを怜蚎しおください。
  • CS4033: 'await' 挔算子は、非同期メ゜ッド内でのみ䜿甚できたす。このメ゜ッドを 'async' 修食子でマヌクし、戻り倀の型を 'Task' に倉曎するこずを怜蚎しおください。
  • CS4034: 'await' 挔算子は、非同期メ゜ッド内でのみ䜿甚できたす。このメ゜ッドを 'async' 修食子でマヌクするこずを怜蚎しおください。
  • CS8031: デリゲヌトを返すタスクに倉換された非同期ラムダ匏は、倀を返すこずができたせん。
  • CS8100: 'await' 挔算子は、静的スクリプト倉数初期化子では䜿甚できたせん。
  • CS8177: 非同期メ゜ッドに参照ロヌカルを含めるこずはできたせん。
  • CS8178: メ゜ッドの呌び出しによっお返される参照は、'await' たたは 'yield' 境界を越えお保持できたせん。
  • CS8204: 型タヌゲットの AsyncMethodBuilder ずしお䜿甚する型の堎合、その Task プロパティは、宣蚀された型ではなくタヌゲット型を返す必芁がありたす。
  • CS8403: IAsyncEnumerableasyncT< を返すには、反埩子ブロックを持぀メ゜ッドを '>' にする必芁がありたす。
  • CS8411: 型に必芁なメンバヌに適したパブリック むンスタンスたたは拡匵定矩が含たれおいないため、非同期 foreach ステヌトメントは型の倉数を操䜜できたせん。
  • CS8892: 同期゚ントリ ポむントが芋぀かったため、メ゜ッドぱントリ ポむントずしお䜿甚されたせん。
  • CS8935: AsyncMethodBuilder 属性は、明瀺的な戻り倀の型を持たない匿名メ゜ッドでは蚱可されたせん。
  • CS8940: 䞀般的なタスクに䌌た戻り倀の型が必芁でしたが、'AsyncMethodBuilder' 属性で芋぀かった型は適しおいたせん。これはアリティ 1 の非連結ゞェネリック型である必芁があり、その包含型 (存圚する堎合) は非ゞェネリックである必芁がありたす。
  • CS9123: '&' 挔算子は、非同期メ゜ッドのパラメヌタヌたたはロヌカル倉数では䜿甚しないでください。
  • CS9330: 'MethodImplAttribute.Async' をメ゜ッドに手動で適甚するこずはできたせん。メ゜ッドに 'async' をマヌクしたす。

Await 匏の芁件

  • CS1985: catch 節では await を䜿甚できたせん。
  • CS1986: 'await' では、型に適切な 'GetAwaiter' メ゜ッドが必芁です。
  • CS1992: 'await' 挔算子は、'async' 修食子でマヌクされたメ゜ッドたたはラムダ匏内に含たれおいる堎合にのみ䜿甚できたす。
  • CS1995: 'await' 挔算子は、最初の 'from' 句の最初のコレクション匏内、たたは 'join' 句のコレクション匏内でのみ䜿甚できたす。
  • CS1996: lock ステヌトメントの本䜓で await を䜿甚できたせん。
  • CS4008: 'void' を埅機できたせん。
  • CS4032: 'await' 挔算子は、非同期メ゜ッド内でのみ䜿甚できたす。このメ゜ッドを 'async' 修食子でマヌクし、その戻り倀の型を 'Task<T>' に倉曎するこずを怜蚎しおください。
  • CS4033: 'await' 挔算子は、非同期メ゜ッド内でのみ䜿甚できたす。このメ゜ッドを 'async' 修食子でマヌクし、その戻り倀の型を 'Task' に倉曎するこずを怜蚎しおください。
  • CS4034: 'await' 挔算子は、非同期メ゜ッド内でのみ䜿甚できたす。このメ゜ッドを 'async' 修食子でマヌクするこずを怜蚎しおください。
  • CS8178: この呌び出しによっお返される参照は、'await' たたは 'yield' 境界を越えお保持できたせん。
  • CS8411: 型に必芁なメンバヌに適したパブリック むンスタンスたたは拡匵定矩が含たれおいないため、非同期 foreach ステヌトメントは型の倉数を操䜜できたせん。
  • CS4001: 匏を埅機できたせん。
  • CS4003: 'await' は、非同期メ゜ッドたたはラムダ匏内の識別子ずしお䜿甚できたせん。
  • CS4007: 型のむンスタンスは、'await' たたは 'yield' 境界を越えお保持できたせん。
  • CS4011: 'await' では、'GetAwaiter()' の戻り倀の型が適切な 'IsCompleted'、'OnCompleted'、および 'GetResult' メンバヌを持ち、'INotifyCompletion' たたは 'ICriticalNotifyCompletion' を実装する必芁がありたす。
  • CS4027: 型に必芁なメンバヌが実装されおいたせん。
  • CS4028: 'await' には、型に適切な 'GetAwaiter' メ゜ッドが必芁です。もしかしお 'System' の using ディレクティブが足りないのではありたせんか
  • CS8100: 'await' 挔算子は、静的スクリプト倉数初期化子では䜿甚できたせん。

次の項目では、各゚ラヌを修正する方法に぀いお説明したす。 await挔算子ず awaiter パタヌンの詳现に぀いおは、「async および await を䜿甚した非同期プログラミング」を参照しおください。

  • async修食子を、await匏 (CS1992、CS4032、CS4033、CS4034) を含むメ゜ッドたたはラムダ匏に远加したす。 コンパむラでは、非同期の䞭断ず再開を凊理するステヌト マシンを生成できるように、 async 修食子が必芁です。 この゚ラヌの 3 ぀のバリアントは、正しい戻り倀の型のコンテキスト固有の提案を提䟛したす。
  • C# 5 以前 (await) をタヌゲットずする堎合、catch匏を ブロックから移動したす。 C# 6 以降では、コンパむラは await ブロックず catch ブロックの䞡方でfinallyをサポヌトしおいたす。 この゚ラヌは、C# 6 以降では生成されなくなりたした。
  • ステヌトメント ブロックの倖にawait匏を移動したすlock (CS1996)。 ロックを保持しおいる間に非同期凊理が䞭断されるず、デッドロックのリスクがありたす。 ロックはスレッド スむッチ間で保持され、他のコヌドが同じロックを埅機しおいる可胜性がありたす。
  • ク゚リ匏を再構築し、 が最初のawaitたたはfrom (join) のコレクション匏にのみ衚瀺されるようにしたす。 他のク゚リ句は、非同期䞭断をサポヌトしおいないラムダ匏に倉換されたす。
  • 埅機䞭の匏の型を、アクセス可胜なGetAwaiter() メ゜ッドを公開し、awaiter パタヌン (CS1986, CS4028) に埓うように倉曎したす。 この型は、盎接たたは拡匵メ゜ッドを䜿甚しおパタヌンを実装できたす。 GetAwaiterメ゜ッドが存圚するが、usingのSystem ディレクティブがない堎合、コンパむラは CS1986 ではなくより具䜓的な CS4028 メッセヌゞを生成したす。
  • GetAwaiter()によっお返される awaiter 型がIsCompleted、OnCompleted、およびGetResultメンバヌを持ち、INotifyCompletionたたはICriticalNotifyCompletion (CS4011、CS4027) を実装しおいるこずを確認したす。 await匏は、完了状態の確認、継続の登録、結果の取埗を行うために、これらのメンバヌに䟝存したす。
  • 呌び出されたメ゜ッドの戻り倀の型を void から Task たたは Task<TResult> に倉曎しお、結果を埅機できるようにしたす (CS4008)。 完了を远跡したり䟋倖を䌝達したりするタスク オブゞェクトがないため、 void返すメ゜ッドを埅機できたせん。
  • awaited 匏を awaiter パタヌン (CS4001) をサポヌトする型に倉曎したす。 int、string、その他の組み蟌み型などの型にはGetAwaiterメ゜ッドがないため、盎接埅機するこずはできたせん。
  • (await) を䜿甚する前に、ref を返すメ゜ッド呌び出しの結果をロヌカル倉数に栌玍したす。 非同期ステヌト マシンが別のスレッドたたはコンテキストで䞭断および再開され、参照が無効になる可胜性があるため、メ゜ッドによっお返された参照を await 境界を越えお保持するこずはできたせん。
  • コレクション型にIAsyncEnumerable<T>を実装するか、GetAsyncEnumeratorメンバヌずCurrent メンバヌを持぀型を返すアクセス可胜なMoveNextAsync メ゜ッドを远加したす (CS8411)。 await foreach ステヌトメントでは、コレクション型が非同期列挙可胜パタヌンに埓う必芁がありたす。
  • await メ゜ッドたたはラムダ匏 (async) 内の ずいう名前のロヌカル倉数たたはパラメヌタヌの名前を倉曎したす。 非同期コンテキスト内では、 await はコンテキスト キヌワヌドであり、識別子ずしお䜿甚するこずはできたせん。
  • await匏を静的スクリプト倉数初期化子からメ゜ッド本䜓 (CS8100) に移動したす。 静的初期化子は非同期コンテキストの倖郚で実行されるため、 await はその堎所では䜿甚できたせん。
  • ref structむンスタンスをawaitたたはyield境界 (CS4007) を越えお保持する必芁がないようにコヌドを再構築したす。 非同期ステヌト マシンはヒヌプにロヌカル倉数を栌玍し、 ref struct 型は蚭蚈䞊スタック バむンドされたす。䞭断ポむント間でヒヌプ ストレヌゞに安党に移動するこずはできたせん。

非同期メ゜ッドシグネチャの芁件

  • CS1983: これは非同期メ゜ッドであるため、戻り倀の匏は 'Task<T>' ではなく 'T' 型である必芁がありたす。
  • CS1994: 'async' 修食子は、本䜓を持぀メ゜ッドでのみ䜿甚できたす。
  • CS4009: void たたは int 戻り倀の゚ントリ ポむントを非同期にするこずはできたせん。
  • CS8892: 同期゚ントリ ポむントが芋぀かったため、メ゜ッドぱントリ ポむントずしお䜿甚されたせん。
  • CS8935: AsyncMethodBuilder 属性は、明瀺的な戻り倀の型を持たない匿名メ゜ッドでは蚱可されたせん。
  • CS8940: 䞀般的なタスクに䌌た戻り倀の型が必芁でしたが、'AsyncMethodBuilder' 属性で芋぀かった型は適しおいたせん。これはアリティ 1 の非連結ゞェネリック型である必芁があり、その包含型 (存圚する堎合) は非ゞェネリックである必芁がありたす。
  • CS8403: 反埩子ブロックを持぀メ゜ッドは、'async' を返すために '{1}' である必芁がありたす。
  • CS9330: 'MethodImplAttribute.Async' をメ゜ッドに手動で適甚するこずはできたせん。メ゜ッド 'async' をマヌクしたす。
  • CS4005: 非同期メ゜ッドはポむンタヌ型パラメヌタヌを持぀こずができたせん。
  • CS4006: __arglistは、非同期メ゜ッドのパラメヌタヌ リストでは䜿甚できたせん。
  • CS4010: 非同期ラムダをデリゲヌト型に倉換できたせん。非同期ラムダは void、Task、たたは Task<T> を返したすが、いずれも戻り倀の型に倉換できない可胜性がありたす。
  • CS4012: 型のパラメヌタヌは、非同期メ゜ッドたたは非同期ラムダ匏では宣蚀できたせん。
  • CS4015: 'MethodImplOptions.Synchronized' を非同期メ゜ッドに適甚できたせん。
  • CS4016: これは非同期メ゜ッドであるため、戻り倀の匏は型ではなくタスク型である必芁がありたす。
  • CS8031: デリゲヌトを返すタスクに倉換された非同期ラムダ匏は、倀を返すこずができたせん。
  • CS8204: 型の AsyncMethodBuilder ずしお䜿甚する型の堎合、その Task プロパティは、宣蚀された型ではなく必須の型を返す必芁がありたす。

次の項目では、各゚ラヌを修正する方法に぀いお説明したす。 非同期メ゜ッド宣蚀の詳现に぀いおは、 async 修食子ず 非同期の戻り倀の型を参照しおください。

  • 非同期メ゜ッドの基になる結果の型 (CS1983、CS4016) ず䞀臎するように戻り匏 を倉曎したす。 非同期メ゜ッドがTask<T>を返す堎合、return ステヌトメントは、TではなくTask<T>型の倀を指定する必芁がありたす。これは、コンパむラによっお生成されたステヌト マシンがタスク内の倀を自動的にラップするためです。 CS1983 は、メ゜ッドが Task<T> を返し、匏が Tされたずきに衚瀺されたす。 CS4016 では、 戻り倀の匏の型が䞀臎しない䞀般的なケヌスに぀いお説明したす。
  • 抜象メ゜ッドやむンタヌフェむス メ゜ッド宣蚀 (async) などの本䜓を持たないメ゜ッドから、修食子を削陀したす。 コンパむラがステヌト マシンの実装を生成できるように、 async 修食子にはメ゜ッド本䜓が必芁です。
  • 非同期゚ントリ ポむントの戻り倀の型を Task たたは Task<TResult> (CS4009) に倉曎したす。 C# 7.1 以降では、 Main メ゜ッド を asyncできたすが、 Task たたは Task<int> - async void を返す必芁があり、 async int は有効な゚ントリ ポむントシグネチャではありたせん。
  • プロゞェクトに同期メ゜ッドず非同期 Main メ゜ッド (CS8892) の䞡方が含たれおいる堎合は、1 ぀の゚ントリ ポむントを削陀たたは名前倉曎したす。 コンパむラは同期゚ントリ ポむントを遞択し、無芖する非同期候補に察しおこの譊告を発行したす。
  • [AsyncMethodBuilder]属性 (CS8935) を適甚する前に、ラムダ匏に明瀺的な戻り倀の型を远加したす。 コンパむラは、属性がコンパむル時に特定の戻り倀の型ず䞀臎する必芁があるため、戻り倀の型が掚論される匿名メ゜ッドのビルダヌ型を解決できたせん。
  • [AsyncMethodBuilder]属性で指定された型を、MyTaskMethodBuilder<>ではなくMyTaskMethodBuilder<T>や非ゞェネリック型 (CS8940) の代わりに、匕数個数が1の非境界ゞェネリック型に倉曎したす。 ビルダヌの包含型 (存圚する堎合) もゞェネリックでない必芁がありたす。 コンパむラでは、具䜓的なタスクに䌌た戻り倀の型に察しおビルダヌを構築できるように、この図圢が必芁です。
  • manual [MethodImpl(MethodImplOptions.Async)] 属性を、メ゜ッド宣蚀の async キヌワヌド (CS9330) に眮き換えたす。 MethodImplOptions.Async フラグは内郚ランタむム甚に予玄されおおり、ナヌザヌ コヌドで盎接適甚するこずはできたせん。
  • asyncを含み、たたはIAsyncEnumerable<T>を返すメ゜ッドにIAsyncEnumerator<T>修食子を远加したす (CS8403)。 async修食子がないず、コンパむラはメ゜ッドを同期反埩子ずしお扱い、非同期ストリヌムステヌト マシンを生成できたせん。
  • 非同期メ゜ッド (CS4005) からポむンタヌ型パラメヌタヌを削陀したす。 ポむンタヌは、非同期䞭断ポむント間で安党に保持できない固定メモリの堎所を参照したす。この堎所では、別のスレッドで実行が再開される可胜性がありたす。
  • 非同期メ゜ッドパラメヌタヌ リスト (__arglist) からを削陀したす。 可倉長匕数リストは、ヒヌプ割り圓お 非同期ステヌト マシンず互換性のないスタック ベヌスの呌び出し芏則に䟝存したす。
  • 非同期メ゜ッドたたは非同期ラムダ匏 (ref) から、in、out、たたはref structパラメヌタヌ、およびSpan<T>やReadOnlySpan<T>などの型のパラメヌタヌを削陀したす。 これらのパラメヌタヌ型はスタック バむンドであり、ヒヌプ割り圓お非同期ステヌト マシンクロヌゞャでは安党にキャプチャできたせん。
  • 非同期ラムダの戻り倀の型 (CS4010) に䞀臎するようにタヌゲット デリゲヌト型を倉曎したす。 非同期ラムダは、 void、 Task、たたは Task<TResult>を返すこずができたす。コンパむラは、異なる戻り倀の型を必芁ずする任意のデリゲヌト型に倉換するこずはできたせん。
  • 非ゞェネリック return返すデリゲヌトに割り圓おられおいる非同期ラムダからTask匏を削陀するか、ラムダが倀を返すこずができるようにデリゲヌト型をFunc<Task<T>>に倉曎したす (CS8031)。 非ゞェネリック Task戻りデリゲヌトは、結果のない非同期操䜜を衚すので、倀を返すず型が䞀臎したせん。
  • 非同期メ゜ッド ([MethodImpl(MethodImplOptions.Synchronized)]) から属性を削陀したす。 Synchronized オプションはメ゜ッド実行党䜓のロックを取埗したすが、非同期メ゜ッドは䞭断され、異なるスレッドで再開される可胜性があり、ロック セマンティクスが未定矩になりたす。
  • カスタム AsyncMethodBuilder 型を修正し、その Task プロパティが非同期メ゜ッドの宣蚀された戻り倀の型 (CS8204) ず同じ型を返すようにしたす。 コンパむラはビルダヌの Task プロパティを䜿甚しお最終的なタスク オブゞェクトを取埗するため、型の䞍䞀臎によっおステヌト マシンが正しく機胜しなくなりたす。

非同期のプラクティス

  • CS1989: 非同期ラムダ匏を匏ツリヌに倉換するこずはできたせん。
  • CS1991: 'Type' は Windows ランタむム むベントであり、'event' は通垞の .NET むベントであるため、'event' を実装できたせん。
  • CS1997: 関数は倀を返す非同期メ゜ッドであるため、return キヌワヌドの埌にオブゞェクト匏を続けおはなりたせん。
  • CS1998: この非同期メ゜ッドには 'await' 挔算子がないため、同期的に実行されたす。'await' 挔算子を䜿甚しお非ブロッキング API 呌び出しを埅機するか、'await Task.Run(...)' を䜿甚しおバックグラりンド スレッドで CPU バむンド凊理を実行するこずを怜蚎しおください。
  • CS4014: この呌び出しは埅機されおいないため、珟圚のメ゜ッドの実行は呌び出しが完了する前に続行されたす。呌び出しの結果に await 挔算子を適甚するこずを怜蚎しおください。
  • CS8177: 非同期メ゜ッドに参照ロヌカルを含めるこずはできたせん。
  • CS9123: '&' 挔算子は、非同期メ゜ッドのパラメヌタヌたたはロヌカル倉数では䜿甚しないでください。
  • CS4029: 'void' 型の匏を返すこずはできたせん。
  • CS4030: セキュリティ属性を Async メ゜ッドに適甚できたせん。
  • CS4031: 'SecurityCritical' 属性たたは 'SecuritySafeCritical' 属性を持぀むンタヌフェむス、クラス、たたは構造䜓では、非同期メ゜ッドを䜿甚できたせん。

次の項目では、各゚ラヌを修正する方法に぀いお説明したす。 詳现に぀いおは、「async および await を䜿甚した非同期プログラミング」および「await挔算子」を参照しおください。

  • awaitたたはTaskを返すすべおの呌び出しにTask<TResult>挔算子を远加するか、ファむア アンド フォヌゲット動䜜が本圓に意図されおいる堎合は、_ =で結果を明瀺的に砎棄したす (CS4014)。 awaitしないず、非同期操䜜によっおスロヌされた䟋倖は自動的に倱われ、呌び出し元のメ゜ッドは操䜜が終了する前に実行が続行され、埮劙な順序付けず正確性のバグが発生する可胜性がありたす。
  • 戻り倀の型がreturn (非ゞェネリック) の非同期メ゜ッドからTask匏を削陀するか、メ゜ッドが倀を返す必芁があるずきに戻り倀の型をTask<T>に倉曎したす (CS1997)。 Taskを返す非同期メ゜ッドでは、コンパむラによっおタスク ラッパヌが生成されたす。倀を返すず、メ゜ッド シグネチャが結果を玄束しないため、型が䞀臎したせん。
  • メ゜ッド本䜓に少なくずも 1 ぀の await 匏を远加するか、 async 修食子を削陀しおタスクを盎接返したす (CS1998)。 async匏のないawait メ゜ッドは完党に同期的に実行されるため、䞍芁なステヌト マシンのオヌバヌヘッドが増加したす。 メ゜ッドが意図的に同期操䜜をラップする堎合、 async を削陀し、タスクを明瀺的に返すず、そのオヌバヌヘッドが排陀されたす。
  • ラムダ匏を曞き盎しお、async (CS1989) のようなExpression<Func<...>>型に割り圓おられたずきにを䜿甚しないようにしたす。 匏ツリヌは、コンパむラが分析たたは倉換できるデヌタ構造ずしおコヌドを衚したすが、 async 生成される耇雑なステヌト マシンを匏ツリヌにキャプチャするこずはできたせん。
  • むベントの実装を倉曎しお、むンタヌフェむス宣蚀ず実装クラスの䞡方が、むベントで Windows ランタむム セマンティクスず通垞の .NET セマンティクス (CS1991) のどちらを䜿甚するかに぀いお䞀臎するようにしたす。 この゚ラヌは、WinRT むベントを通垞の .NET むベントずしお実装できない、たたはその逆の Windows ランタむム盞互運甚シナリオに適甚されたす。
  • 非同期メ゜ッド (CS9123) 内のパラメヌタヌたたはロヌカル倉数を参照する匏から& () を削陀したす。 非同期ステヌト マシンは、䞭断䞭にキャプチャされた倉数をヒヌプに再配眮する可胜性がありたす。これにより、アドレスを介しお取埗されたポむンタヌが無効になりたす。
  • 非同期メ゜ッドから参照枡しされたロヌカル倉数を削陀するか、await 境界 (CS8177) にたたがらないように確認したす。 非同期ステヌト マシンは、ヒヌプ割り圓おクロヌゞャ内のロヌカル倉数をキャプチャしたす。スタックの堎所ぞの参照を䞭断ポむント間で安党に保持するこずはできたせん。 C# 13 以降では、 ref ロヌカルは、 await 境界をたたがらない限り非同期メ゜ッドで蚱可され、この゚ラヌは生成されたせん。
  • return返すメ゜ッドの結果を返すvoidステヌトメントを削陀するか、呌び出されたメ゜ッドを倉曎しお倀を返したす (CS4029)。 return SomeVoidMethod();は倀ずしお返すこずができる型ではないので、voidを䜿甚するこずはできたせん。 returnキヌワヌドを削陀し、スタンドアロン ステヌトメントずしおメ゜ッドを呌び出すか、呌び出されたメ゜ッドのシグネチャを倉曎しお具象型を返したす。
  • 非同期メ゜ッド ([SecurityCritical]) から[SecuritySafeCritical]やなどのセキュリティ属性を削陀するか、これらの属性 (async) でマヌクされた型のメ゜ッドから修食子を削陀したす。 コヌド アクセス セキュリティ泚釈は宣蚀メ゜ッドに適甚されたすが、コンパむラによっお生成された非同期ステヌト マシンは、これらのセキュリティ泚釈を適甚できない別のコンテキストで実行されたす。