CA2247:传递给 TaskCompletionSource 构造函数的参数应为 TaskCreationOptions 枚举,而不是 TaskContinuationOptions 枚举

属性
规则 ID CA2247
标题 传递给 TaskCompletionSource 构造函数的参数应为 TaskCreationOptions 枚举,而不是 TaskContinuationOptions 枚举
类别 使用情况
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用 作为警告

原因

使用 System.Threading.Tasks.TaskContinuationOptions 枚举值而不是 System.Threading.Tasks.TaskCreationOptions 枚举值构造 System.Threading.Tasks.TaskCompletionSource。 使用 System.Object.ReferenceEquals 方法来测试一个或多个值类型是否相等。

规则说明

TaskCompletionSource 类型具有一个接受 System.Threading.Tasks.TaskCreationOptions 枚举值的构造函数和另一个接受 Object 的构造函数。 意外传递 System.Threading.Tasks.TaskContinuationOptions 枚举值而不是 System.Threading.Tasks.TaskCreationOptions 枚举值会导致调用基于 Object 的构造函数:它将编译和运行,但它不具有预期的行为。

如何解决冲突

若要解决冲突,请将 System.Threading.Tasks.TaskContinuationOptions 枚举值替换为相应的 System.Threading.Tasks.TaskCreationOptions 枚举值。

    // Violation
    var tcs = new TaskCompletionSource<int>(TaskContinuationOptions.RunContinuationsAsynchronously);

    // Fixed
    var tcs = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);

何时禁止显示警告

此规则的冲突几乎总是突出调用代码中的 Bug,这样一来,代码的行为将与开发人员的预期不符,而 TaskCompletionSource 实际上忽略了指定的选项。 唯一可禁止显示警告的情况是,开发人员实际上打算将装箱的 System.Threading.Tasks.TaskContinuationOptions 作为对象状态参数传递给 TaskCompletionSource

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA2247
// The code that's violating the rule is on this line.
#pragma warning restore CA2247

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA2247.severity = none

若要禁用此整个规则类别,请在配置文件中将此类别的严重性设置为 none

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Usage.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

另请参阅