CA2247: аргумент, переданный конструктору TaskCompletionSource, должен быть перечислением TaskCreationOptions вместо перечисления TaskContinuationOptions

Свойство Значение
Идентификатор правила CA2247
Заголовок аргумент, переданный в конструктор TaskCompletionSource, должен быть перечислением TaskCreationOptions, а не TaskContinuationOptions
Категория Использование
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предупреждение

Причина

Создание 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

Дополнительные сведения см. в разделе "Подавление предупреждений анализа кода".

См. также