Freigeben über


Fehler und Warnungen im Zusammenhang mit ref struct-Typen

  • CS8343: ref structs können keine Schnittstellen implementieren.
  • CS8344: Die foreach-Anweisung kann nicht für Enumerationszeichen in asynchronen oder Iteratormethoden verwendet werden, da der Typ ein ref struct oder ein Typparameter ist, der ref struct zulässt.
  • CS8345: Feld- oder automatisch implementierte Eigenschaft darf nicht vom Typ sein, es sei denn, es handelt sich um ein Instanzmember einer ref struct.
  • CS9048: Der scoped-Modifizierer kann nur für refs und ref struct-Werte verwendet werden.
  • CS9050: Ein ref-Feld kann nicht auf ref struct verweisen.
  • CS9059: Ein „ref“-Feld kann nur in „ref struct“ deklariert werden.
  • CS9241: „ref struct“ ist bereits angegeben.
  • CS9242: Die Einschränkungsklausel „allows“ muss die letzte angegebene Einschränkung sein.
  • CS9243: Kann keine „ref struct“ für einen Typparameter zulassen, der bei anderen Einschränkungen als Klasse bekannt ist
  • CS9244: Der Typ darf kein ref struct oder ein Typparameter sein, der „ref struct“ zulässt, um dies als Parameter im generischen Typ oder der generischen Methode zu verwenden.
  • CS9245: Der Typ kann keine Schnittstellenmember für den ref struct-Typ implementieren.
  • CS9246: Auf einen nicht-virtueller Schnittstellenmember kann nicht mit einem Typparameter zugegriffen werden, der „ref struct“ erlaubt.
  • CS9247: Die foreach-Anweisung kann nicht auf Enumeratoren des Typs ausgeführt werden, da es sich um einen Typparameter handelt, der „ref struct“ zulässt und zur Kompilierzeit nicht zum Implementieren von IDisposable bekannt ist.
  • CS9267: Elementtyp eines Iterators kann keine Refstruktur oder ein Typparameter sein, der Refstrukturen zulässt.

„ref“-Sicherheitsverstöße

  • CS8345: Feld- oder automatisch implementierte Eigenschaft darf nicht vom Typ sein, es sei denn, es handelt sich um ein Instanzmember einer ref struct.
  • CS9048: Der scoped-Modifizierer kann nur für refs und ref struct-Werte verwendet werden.
  • CS9050: Ein ref-Feld kann nicht auf ref struct verweisen.
  • CS9059: Ein ref-Feld kann nur in ref struct deklariert werden.

Ein ref struct-Typ kann ref-Felder enthalten. Andere Typen sind keine zulässigen ref-Felder. Der Compiler erzwingt Einschränkungen für die Deklarationen und die Verwendung von ref struct-Typen, um „ref“-Sicherheitsregeln für Instanzen eines beliebigen ref struct-Typs durchzusetzen:

  • Nur ref struct Typen können automatisch implementierte ref Eigenschaften enthalten.
  • Nur ref struct-Typen oder ref-Variablen können den scoped-Modifizierer aufweisen.
  • Ein ref-Feld kann nur in einem ref struct-Typ deklariert werden.
  • Ein ref-Feld kann nicht auf einen ref struct-Typ verweisen.

Ein Verstoß gegen eine dieser Regeln führt zu einem der aufgeführten Fehler. Wenn Sie dieses Sprachfeature verwenden möchten, konvertieren Sie den Typ in ref struct. Entfernen Sie andernfalls das unzulässige Konstrukt.

„ref struct“-Schnittstellenimplementierungen

  • CS8343: ref structs können keine Schnittstellen implementieren.
  • CS8344: Die foreach-Anweisung kann nicht für Enumerationszeichen in asynchronen oder Iteratormethoden verwendet werden, da der Typ ein ref struct oder ein Typparameter ist, der ref struct zulässt.
  • CS9241: „ref struct“ ist bereits angegeben.
  • CS9242: Die Einschränkungsklausel „allows“ muss die letzte angegebene Einschränkung sein.
  • CS9243: Kann keine „ref struct“ für einen Typparameter zulassen, der bei anderen Einschränkungen als Klasse bekannt ist
  • CS9244: Der Typ darf kein ref struct oder ein Typparameter sein, der „ref struct“ zulässt, um dies als Parameter im generischen Typ oder der generischen Methode zu verwenden.
  • CS9245: Der Typ kann keine Schnittstellenmember für den ref struct-Typ implementieren.
  • CS9246: Auf einen nicht-virtueller Schnittstellenmember kann nicht mit einem Typparameter zugegriffen werden, der „ref struct“ erlaubt.
  • CS9247: Die foreach-Anweisung kann nicht auf Enumeratoren des Typs ausgeführt werden, da es sich um einen Typparameter handelt, der „ref struct“ zulässt und zur Kompilierzeit nicht zum Implementieren von IDisposable bekannt ist.
  • CS9267: Elementtyp eines Iterators kann keine Refstruktur oder ein Typparameter sein, der Refstrukturen zulässt.

Vor C# 13 können ref struct-Typen keine Schnittstellen implementieren. Der Compiler generiert CS8343. Ab C# 13 können ref struct-Typen basierend auf den folgenden Regeln Schnittstellen implementieren:

  • Eine ref struct kann nicht in eine Instanz einer von ihr implementierten Schnittstelle konvertiert werden. Diese Einschränkung umfasst die implizite Konvertierung, wenn Sie einen ref struct-Typ als Argument verwenden, wenn der Parameter ein Schnittstellentyp ist. Die Konvertierung führt zu einer Boxing-Konvertierung, die gegen die Verweissicherheit verstößt.
  • Eine ref struct, die eine Schnittstelle implementiert, muss alle Schnittstellenmitglieder implementieren. Die ref struct muss Mitglieder implementieren, in denen die Schnittstelle eine Standardimplementierung enthält.

Ab C# 13 kann ref struct als Typargument für einen generischen Typparameter verwendet werden, allerdings nur, wenn dieser über die allows ref struct-Antieinschränkung verfügt. Wenn Sie die allows ref struct-Antieinschränkung verwenden, müssen Sie die folgenden Regeln befolgen:

  • ref struct wird als Typargument verwendet, und der Typparameter muss über die allows ref struct-Antieinschränkung verfügen. Die allows ref struct-Antieinschränkung muss der letzte Teil der where-Klausel sein.
  • Beim Verwenden des Typparameters müssen die „ref“-Sicherheitsregeln beachtet werden.
  • Ein ref struct oder ein Typargument, das ein ref struct Typ sein kann, kann nicht als Elementtyp für eine Iteratormethode verwendet werden.