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.