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 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.

Zobacz też