CA2261: ConfigureAwaitOptions.SuppressThrowingTask<TResult> と共に使用しない

プロパティ
ルール ID CA2261
Title ConfigureAwaitOptions.SuppressThrowingTask<TResult> と共に使用しない
カテゴリ 使用方法
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 警告として

原因

ConfigureAwaitOptions.SuppressThrowing の値が Task<TResult>.ConfigureAwait(ConfigureAwaitOptions) に渡されます。

規則の説明

この ConfigureAwaitOptions.SuppressThrowing オプションは、無効な TResult を返す可能性があるため、ジェネリック Task<TResult> ではサポートされていません。 このルールでは、実行時ではなくビルド時にエラーが明らかになるように、SuppressThrowing の使用に Task<TResult> のフラグが設定されます。

違反の修正方法

ConfigureAwait(ConfigureAwaitOptions) を呼び出す前に Task<TResult> を非ジェネリック Task にキャストします。

次のコード スニペットは CA2261 の違反を示しています。

Task<int> t = new Task<int>(() => 1);
t.ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing);

次のコード スニペットは修正プログラムを示しています。

Task<int> t = new Task<int>(() => 1);
((Task)t).ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing);

どのようなときにエラーを抑制するか

このルールからの警告は抑制しないでください。 タスクでエラーが発生した場合、または取り消された場合、TResult は無効になり、実行時エラーが発生します。