Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
| Eigenschaft | Wert |
|---|---|
| Regel-ID | CA2247 |
| Titel | An das Argument des TaskCompletionSource-Konstruktors sollte eine TaskCreationOptions-Enumeration übergeben werden, nicht eine TaskContinuationOptions-Enumeration. |
| Kategorie | Verwendung |
| Fix führt zu Unterbrechungen oder bleibt funktionsfähig | Untrennbar |
| Standardmäßig in .NET 10 aktiviert | Als Warnung |
| Anwendbare Sprachen | C# und Visual Basic |
Ursache
Erstellen eines System.Threading.Tasks.TaskCompletionSource mit einer System.Threading.Tasks.TaskContinuationOptions-Enumerationskonstante anstelle einer System.Threading.Tasks.TaskCreationOptions-Enumerationskonstante.
Verwenden Sie die System.Object.ReferenceEquals-Methode, um einen oder mehrere Werttypen auf Gleichheit zu testen.
Regelbeschreibung
Der TaskCompletionSource-Typ verfügt über einen Konstruktor, der einen System.Threading.Tasks.TaskCreationOptions-Enumeration-Wert akzeptiert, sowie einen weiteren Konstruktor, der eine Object akzeptiert. Wenn Sie versehentlich einen System.Threading.Tasks.TaskContinuationOptions-Enumerationwert anstelle eines System.Threading.Tasks.TaskCreationOptions Enumerationwerts übergeben, führt dies dazu, dass der Object-basierte Konstruktor aufgerufen wird: er wird kompiliert und ausgeführt, wird aber nicht das beabsichtigte Verhalten zeigen.
So beheben Sie Verstöße
Um die Verstöße zu beheben, ersetzen Sie den Enumerationswert System.Threading.Tasks.TaskContinuationOptions durch den entsprechenden Enumerationswert System.Threading.Tasks.TaskCreationOptions .
// Violation
var tcs = new TaskCompletionSource<int>(TaskContinuationOptions.RunContinuationsAsynchronously);
// Fixed
var tcs = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
Wann sollten Warnungen unterdrückt werden?
Ein Verstoß gegen diese Regel hebt fast immer einen Fehler im aufrufenden Code hervor, sodass sich der Code nicht so verhält, wie es der Entwickler wollte, d. h. die TaskCompletionSource ignoriert die angegebene Option. Eine Warnung kann nur dann sicher unterdrückt werden, wenn der Entwickler tatsächlich beabsichtigte, ein gepacktes System.Threading.Tasks.TaskContinuationOptions als Objektzustands-Argument an die TaskCompletionSource zu übergeben.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA2247
// The code that's violating the rule is on this line.
#pragma warning restore CA2247
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad auf none in der Konfigurationsdatei fest.
[*.{cs,vb}]
dotnet_diagnostic.CA2247.severity = none
Um diese gesamte Kategorie von Regeln zu deaktivieren, legen Sie den Schweregrad für die Kategorie auf none in der Konfigurationsdatei fest.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Usage.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.