Partage via


CA2247 : L’argument passé au constructeur TaskCompletionSource doit être l’enum TaskCreationOptions au lieu de l’enum TaskContinuationOptions

Propriété Value
Identificateur de la règle CA2247
Titre L’argument passé au constructeur TaskCompletionSource doit être l’enum TaskCreationOptions au lieu de l’enum TaskContinuationOptions
Catégorie Utilisation
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 À titre d’avertissement

Cause

Construction d’un System.Threading.Tasks.TaskCompletionSource avec une valeur d’énumération System.Threading.Tasks.TaskContinuationOptions plutôt qu’une valeur d’énumération System.Threading.Tasks.TaskCreationOptions. Utilisation de la méthode System.Object.ReferenceEquals pour tester l’égalité d’un ou plusieurs types valeur.

Description de la règle

Le type TaskCompletionSource a un constructeur qui accepte une valeur d’énumération System.Threading.Tasks.TaskCreationOptions, et un autre constructeur qui accepte un Object. La transmission accidentelle d’une valeur d’énumération System.Threading.Tasks.TaskContinuationOptionsau lieu d’une valeur d’énumération System.Threading.Tasks.TaskCreationOptions entraîne l’appel du constructeur basé sur Object : il sera compilé et exécuté, mais il n’aura pas le comportement prévu.

Comment corriger les violations

Pour corriger la violation, remplacez la valeur d’énumération System.Threading.Tasks.TaskContinuationOptions par la valeur d’énumération System.Threading.Tasks.TaskCreationOptions correspondante.

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

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

Quand supprimer les avertissements

Une violation de cette règle met presque toujours en évidence un bogue dans le code appelant, de sorte que le code ne se comporte pas comme le développeur l’a prévu, TaskCompletionSource ignorant l’option spécifiée. La seule fois où vous pouvez sans risque supprimer l’avertissement est si le développeur a réellement l’intention de passer un System.Threading.Tasks.TaskContinuationOptions boxed comme argument d’état de l’objet au TaskCompletionSource.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

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

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

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

Pour désactiver la catégorie entière des règles, définissez la gravité de la catégorie sur none dans le fichier de configuration.

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

Pour plus d’informations, consultez Guide pratique pour supprimer les avertissements de l’analyse de code.

Voir aussi