CA2261:请勿将 ConfigureAwaitOptions.SuppressThrowingTask<TResult> 搭配使用

属性
规则 ID CA2261
标题 请勿将 ConfigureAwaitOptions.SuppressThrowingTask<TResult> 搭配使用
类别 使用情况
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用 作为警告

原因

ConfigureAwaitOptions.SuppressThrowing 的值将传递给 Task<TResult>.ConfigureAwait(ConfigureAwaitOptions)

规则说明

泛型 Task<TResult> 不支持 ConfigureAwaitOptions.SuppressThrowing 选项,因为这可能会导致返回无效 TResult。 此规则标记 SuppressThrowingTask<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 将无效并导致运行时错误。