CA2247:传递给 TaskCompletionSource 构造函数的参数应为 TaskCreationOptions 枚举,而不是 TaskContinuationOptions 枚举
属性 | 值 |
---|---|
规则 ID | CA2247 |
标题 | 传递给 TaskCompletionSource 构造函数的参数应为 TaskCreationOptions 枚举,而不是 TaskContinuationOptions 枚举 |
类别 | 使用情况 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 9 中默认启用 | 作为警告 |
原因
使用 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
有关详细信息,请参阅如何禁止显示代码分析警告。