CA2247: Argument przekazany do konstruktora TaskCompletionSource powinien mieć wyliczenie TaskCreationOptions zamiast wyliczenia TaskContinuationOptions
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2247 |
Tytuł | Argument przekazany do konstruktora TaskCompletionSource musi być wyliczeniem TaskCreationOptions, a nie wyliczeniem TaskContinuationOptions |
Kategoria | Użycie |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Jako ostrzeżenie |
Przyczyna
Konstruowanie elementu System.Threading.Tasks.TaskCompletionSource
z wartością wyliczeniową System.Threading.Tasks.TaskContinuationOptions , a nie wartością wyliczeniową System.Threading.Tasks.TaskCreationOptions .
Używanie System.Object.ReferenceEquals metody do testowania co najmniej jednego typu wartości pod kątem równości.
Opis reguły
Typ TaskCompletionSource ma konstruktor, który akceptuje wartość wyliczeniową System.Threading.Tasks.TaskCreationOptions , a inny konstruktor, który akceptuje Objectelement . Przypadkowe przekazanie System.Threading.Tasks.TaskContinuationOptions wartości wyliczenia zamiast wartości wyliczeniowej System.Threading.Tasks.TaskCreationOptions spowoduje wywołanie konstruktora opartego Objectna metodzie : zostanie skompilowany i uruchomiony, ale nie będzie miał zamierzonego zachowania.
Jak naprawić naruszenia
Aby naprawić naruszenie, zastąp System.Threading.Tasks.TaskContinuationOptions wartość wyliczenia odpowiednią System.Threading.Tasks.TaskCreationOptions wartością wyliczenia.
// Violation
var tcs = new TaskCompletionSource<int>(TaskContinuationOptions.RunContinuationsAsynchronously);
// Fixed
var tcs = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
Kiedy pomijać ostrzeżenia
Naruszenie tej reguły prawie zawsze wyróżnia usterkę w kodzie wywołującym, tak aby kod nie zachowywał się zgodnie z oczekiwaniami dewelopera, a źródło TaskCompletionSource skutecznie ignoruje określoną opcję. Jedyny czas, w jakim można pominąć ostrzeżenie, jest to, że deweloper rzeczywiście zamierza przekazać pole System.Threading.Tasks.TaskContinuationOptions jako argument stanu obiektu do TaskCompletionSource
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA2247
// The code that's violating the rule is on this line.
#pragma warning restore CA2247
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2247.severity = none
Aby wyłączyć tę całą kategorię reguł, ustaw ważność dla kategorii na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Usage.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia analizy kodu.