Udostępnij za pośrednictwem


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 powinien być wyliczeniem TaskCreationOptions zamiast wyliczeniem TaskContinuationOptions.
Kategoria Użycie
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Jako ostrzeżenie
Zastosowane języki C# i Visual Basic

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 Object. Przypadkowe przekazanie wartości typu wyliczeniowego System.Threading.Tasks.TaskContinuationOptions zamiast wartości typu wyliczeniowego System.Threading.Tasks.TaskCreationOptions spowoduje wywołanie konstruktora opartego na Object: zostanie on skompilowany i uruchomiony, ale nie zachowa się zgodnie z zamierzeniami.

Jak naprawić naruszenia

Aby naprawić naruszenie, zastąp wartość wyliczenia System.Threading.Tasks.TaskContinuationOptions odpowiednią wartością wyliczenia System.Threading.Tasks.TaskCreationOptions.

// 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 wskazuje na usterkę w kodzie wywołującym, w wyniku czego kod nie zachowuje się zgodnie z zamierzeniami programisty. W efekcie TaskCompletionSource skutecznie ignoruje określoną opcję. Jedynym przypadkiem, gdy można pominąć ostrzeżenie, jest sytuacja, gdy deweloper rzeczywiście zamierza przekazać opakowany element 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.

Zobacz też