Condividi tramite


CA2247: l'argomento passato al costruttore TaskCompletionSource deve essere l'enumerazione TaskCreationOptions anziché l'enumerazione TaskContinuationOptions

Proprietà valore
ID regola CA2247
Title L'argomento passato al costruttore TaskCompletionSource deve essere l'enumerazione TaskCreationOptions invece dell'enumerazione TaskContinuationOptions
Categoria Utilizzo
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 Come avviso

Causa

Costruzione di un System.Threading.Tasks.TaskCompletionSource oggetto con un System.Threading.Tasks.TaskContinuationOptions valore di enumerazione anziché un System.Threading.Tasks.TaskCreationOptions valore di enumerazione. Utilizzo del System.Object.ReferenceEquals metodo per testare uno o più tipi di valore per verificare l'uguaglianza.

Descrizione regola

Il tipo TaskCompletionSource ha un costruttore che accetta un System.Threading.Tasks.TaskCreationOptions valore di enumerazione e un altro costruttore che accetta un oggetto Object. Se si passa accidentalmente un System.Threading.Tasks.TaskContinuationOptions valore di enumerazione anziché un System.Threading.Tasks.TaskCreationOptions valore di enumerazione, verrà chiamato il Objectcostruttore basato su : verrà compilato ed eseguito, ma non avrà il comportamento previsto.

Come correggere le violazioni

Per correggere la violazione, sostituire il valore di System.Threading.Tasks.TaskContinuationOptions enumerazione con il valore di enumerazione corrispondente System.Threading.Tasks.TaskCreationOptions .

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

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

Quando eliminare gli avvisi

Una violazione di questa regola evidenzia quasi sempre un bug nel codice chiamante, in modo che il codice non si comporti come previsto dallo sviluppatore, con TaskCompletionSource ignorando effettivamente l'opzione specificata. L'unico momento in cui è sicuro eliminare l'avviso è se lo sviluppatore ha effettivamente intenzione di passare un boxed System.Threading.Tasks.TaskContinuationOptions come argomento dello stato dell'oggetto all'oggetto TaskCompletionSource

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per disabilitare questa intera categoria di regole, impostare la gravità per la categoria su none nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Vedi anche