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 einref struct
oder ein Typparameter ist, derref 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 undref struct
-Werte verwendet werden. - CS9050: Ein
ref
-Feld kann nicht aufref 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 undref struct
-Werte verwendet werden. - CS9050: Ein
ref
-Feld kann nicht aufref struct
verweisen. - CS9059: Ein
ref
-Feld kann nur inref 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 implementierteref
Eigenschaften enthalten. - Nur
ref struct
-Typen oderref
-Variablen können denscoped
-Modifizierer aufweisen. - Ein
ref
-Feld kann nur in einemref struct
-Typ deklariert werden. - Ein
ref
-Feld kann nicht auf einenref 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 einref struct
oder ein Typparameter ist, derref 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 einenref 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. Dieref 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 dieallows ref struct
-Antieinschränkung verfügen. Dieallows ref struct
-Antieinschränkung muss der letzte Teil derwhere
-Klausel sein.- Beim Verwenden des Typparameters müssen die „ref“-Sicherheitsregeln beachtet werden.
- Ein
ref struct
oder ein Typargument, das einref struct
Typ sein kann, kann nicht als Elementtyp für eine Iteratormethode verwendet werden.