Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| 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.