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.
Beheben von Warnungen im Zusammenhang mit den
In diesem Artikel werden die folgenden Compilerfehler behandelt:
-
CS0245: Destruktoren und
object.Finalizekönnen nicht direkt aufgerufen werden. Erwägen Sie stattdessen,IDisposable.Disposeaufzurufen, wenn verfügbar. -
CS0728: Möglicherweise falsche Zuweisung zu einer lokalen Variablen, die das Argument zu einer Using- oder
lockAnweisung ist. DerDisposeAufruf oder die Entsperrung erfolgt mit dem ursprünglichen Wert der lokalen Variablen. -
CS1674: Typ, der in einer using-Anweisung verwendet wird, muss implizit in '
System.IDisposable' konvertierbar sein. -
CS8410: 'Typ, der in einer asynchronen
usingAnweisung verwendet wird, muss implizit in 'System.IAsyncDisposable' konvertierbar sein oder eine geeignete 'DisposeAsync' Methode implementieren. -
CS8417: Typ, der in einer asynchronen Using-Anweisung verwendet wird, muss "
System.IAsyncDisposable" implementieren oder eine geeignete "DisposeAsync" Methode implementieren. Bedeuteten Sie "using' anstelle von 'await using'? -
CS8418: Der Typ, der in einer using-Anweisung verwendet wird, muss '
System.IDisposable' implementieren. Meinten Sie "await using" anstelle von "using"? - CS8647: Eine Using-Variable kann nicht direkt in einem Switchabschnitt verwendet werden (erwägen Sie die Verwendung von geschweiften Klammern).
-
CS8648: Eine
gotokann nach einer using-Deklaration nicht zu einer Position springen. -
CS8649: Eine
gotokann nicht zu einer Position springen, bevor eine Deklaration innerhalb desselben Blocks verwendet wird. - CS9229: Modifizierer können nicht mithilfe von Deklarationen platziert werden.
Implementieren von IDisposable und IAsyncDisposable
Die folgenden Compilerfehler und Warnungen deuten auf Probleme bei der Implementierung oder Verwendung des Dispose-Musters hin:
-
CS0245: Destruktoren und
object.Finalizekönnen nicht direkt aufgerufen werden. Erwägen Sie,IDisposable.Disposeaufzurufen, wenn verfügbar. -
CS1674: Typ, der in einer using-Anweisung verwendet wird, muss implizit in '
System.IDisposable' konvertierbar sein. -
CS8410: Typ, der in einer asynchronen
usingAnweisung verwendet wird, muss implizit in "System.IAsyncDisposable" konvertierbar sein oder eine geeignete "DisposeAsync"-Methode implementieren. -
CS8417: Typ, der in einer asynchronen
usingAnweisung verwendet wird, muss 'System.IAsyncDisposable' implementieren oder eine geeignete 'DisposeAsync' Methode implementieren. Bedeuteten Sie "using' anstelle von 'await using'? -
CS8418: Der in einer using-Anweisung verwendete Typ muss '
System.IDisposable' implementieren. Meinten Sie 'await using' statt 'using'?
Die using-Anweisung stellt sicher, dass Ressourcen am Ende des using Blocks ordnungsgemäß entsorgt werden. Um einen Typ mit einer using Anweisung zu verwenden, muss er die entsprechende Entsorgungsschnittstelle implementieren. Für synchrone using Anweisungen muss der Typ IDisposable implementieren. Für asynchrone await using Anweisungen muss der Typ IAsyncDisposable implementieren.
-
Finalize kann nicht direkt aufgerufen werden (CS0245): Sie können keinen Destruktor oder die Object.Finalize Methode direkt aufrufen. Der Garbage Collector ruft automatisch Finalisierer auf, wenn Objekte nicht mehr referenziert werden. Implementieren Sie stattdessen IDisposable und rufen Sie die Methode
Disposeauf, um eine deterministische Bereinigung zu gewährleisten. -
Typ muss IDisposable (CS1674) implementieren: Nur implementierte IDisposable Typen können in einer
usingAnweisung verwendet werden. Werttypen implementieren diese Schnittstelle nicht, und generische Typparameter ohne ordnungsgemäße Einschränkungen können nicht als einwegbar angenommen werden. Wenden Sie eine Typbeschränkung wiewhere T : IDisposablean, wenn Sie mit generischen Typen arbeiten. -
Typ muss IAsyncDisposable (CS8410) implementieren: Typen, die mit
await usingverwendet werden, müssen IAsyncDisposable implementieren oder eine geeigneteDisposeAsync-Methode bereitstellen. Wenn Ihr Typ die asynchrone Entsorgung nicht unterstützt, verwenden Sie stattdessen eine synchroneusingAnweisung, oder implementieren Sie die erforderliche Schnittstelle. - de-DE: Nicht übereinstimmende Entsorgungsmuster (CS8417, CS8418): CS8417 tritt auf, wenn Sie
await usingmit einem Typ verwenden, der nur IDisposable implementiert wird. CS8418 tritt auf, wenn Sieusingsynchron mit einem Typ verwenden, der IAsyncDisposable nur implementiert. Stimmen Sie dasusingSchlüsselwort mit der Schnittstelle überein, die vom Typ implementiert wird, oder implementieren Sie beide Schnittstellen, wenn Sie beide Muster unterstützen müssen.
Weitere Informationen finden Sie unter Finalizers, Implementieren einer Dispose-Methode und Implementieren einer DisposeAsync-Methode.
Verwendung des Gültigkeitsbereichs von Variablen und des Kontrollflusses
Die folgenden Compilerfehler und -warnungen beziehen sich auf die falsche Verwendung von Variablen innerhalb von using Ablaufanweisungen des Steuerelementflusses:
-
CS0728: Möglicherweise falsche Zuordnung zu einer lokalen Variablen, die das Argument zu einer
usingoderlockAnweisung ist. DerDisposeAufruf oder die Entsperrung erfolgt auf dem ursprünglichen Wert des lokalen. - CS8647: Eine using-Variable kann nicht direkt in einem switch-Abschnitt verwendet werden (Klammern verwenden).
-
CS8648: Eine
gotokann nach einer using-Anweisung nicht zu einer Stelle springen. -
CS8649: Eine
gotokann nicht zu einer Position springen, bevor eine Deklaration innerhalb desselben Blocks verwendet wird.
Variablen, die mit using deklariert wurden, haben spezifische Gültigkeitsbereichsregeln, die Ressourcenlecks verhindern. Der Compiler erzwingt diese Regeln, um eine ordnungsgemäße Entsorgung sicherzustellen.
Zuordnung zur Verwendung der Variablen (CS0728):Diese Warnung gibt an, dass Sie einer Variablen, die die Ressource in einer
usingAnweisung ist, einen neuen Wert zugewiesen haben. Der Dispose-Aufruf erfolgt für den ursprünglichen Wert, nicht für den neu zugewiesenen Wert, was zu Ressourcenlecks führen kann. Initialisieren Sie die Ressource in derusingAnweisungsdeklaration, anstatt sie später zuzuweisen.Verwenden von Variablen im Switch-Abschnitt (CS8647): Eine
usingDeklaration erstellt Variablen, die nach Erreichen des Endes ihres Gültigkeitsbereichs verworfen werden. Wenn sie direkt in einem Schalterabschnitt ohne geschweifte Klammern verwendet wird, ist der Bereich mehrdeutig und kann zu Fehlern führen. Umschließen Sie den Inhalt des Schalterabschnitts in geschweifte Klammern, um den Bereich klar zu definieren.Goto-Anweisungen und Verwenden von Deklarationen (CS8648, CS8649):Sie können keine Anweisungen verwenden
goto, um über Deklarationen zu springenusing, da das Springen die richtige Ressourcenverwaltung überspringen würde. CS8648 tritt auf, wenn man über eineusingDeklaration vorwärts springt; und CS8649 tritt auf, wenn man zu einem Speicherort vor einerusingDeklaration zurückspringt. Strukturieren Sie Ihren Code so, dass strukturierten Steuerungsfluss wie Schleifen verwendet werden, oder verschieben Sie dieusingDeklarierung außerhalb des Sprungziels.
Weitere Informationen finden Sie unter Using-Anweisung.
Falsche using Deklaration
- CS9229: Modifizierer können nicht mithilfe von Deklarationen platziert werden.
Eine variable Deklaration, die in eine using Deklaration eingeschlossen ist, kann keine der folgenden Modifizierer enthalten:
conststaticvolatilereadonly- Modifizierer für Barrierefreiheit:
public, ,protected,internalprivate, , oderprotected internalprivate protected
Im folgenden Beispiel wird CS9229 generiert:
using System;
class Program
{
static void Main()
{
// error CS9229: Modifiers cannot be placed on using declarations.
public using var resource = new Resource();
// error CS9229: Modifiers cannot be placed on using declarations.
static using var anotherResource = new Resource();
}
}
class Resource : IDisposable
{
public void Dispose() { }
}
Um diesen Fehler zu beheben, entfernen Sie den Modifizierer aus der using Deklaration:
using var resource = new Resource();
Weitere Informationen finden Sie unter Using-Anweisung.