CA2247: аргумент, переданный конструктору TaskCompletionSource, должен быть перечислением TaskCreationOptions вместо перечисления TaskContinuationOptions
Свойство | Значение |
---|---|
Идентификатор правила | CA2247 |
Заголовок | аргумент, переданный в конструктор TaskCompletionSource, должен быть перечислением TaskCreationOptions, а не TaskContinuationOptions |
Категория | Использование |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | Как предупреждение |
Причина
Создание System.Threading.Tasks.TaskCompletionSource
со значением перечисления System.Threading.Tasks.TaskContinuationOptions, а не System.Threading.Tasks.TaskCreationOptions.
Использование метода 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);
Когда лучше отключить предупреждения
Нарушение этого правила почти всегда означает ошибку в вызывающем коде, поэтому код не будет работать так, как ожидалось, поскольку 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
Дополнительные сведения см. в разделе "Подавление предупреждений анализа кода".