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