Erreurs et avertissements associés aux types ref struct
- CS8343 :
ref structs
ne peut pas implémenter les interfaces - CS8344 :
foreach
l’instruction ne peut pas fonctionner sur des énumérateurs dans des méthodes asynchrones ou itérateurs, car le type est unref struct
ou un paramètre de type qui autoriseref struct
. - CS8345 : Le champ ou la propriété implémentée automatiquement ne peut pas être de type , sauf s’il s’agit d’un membre d’instance d’un
ref struct
. - CS9048 : le modificateur
scoped
peut être utilisé uniquement pour les références et les valeursref struct
. - CS9050 : un champ
ref
ne peut pas faire référence à unref struct
. - CS9059 : un champ de référence ne peut être déclaré que dans un ref struct.
- CS9241 : « ref struct » est déjà spécifié.
- CS9242 : la clause de contrainte « allows » doit être la dernière contrainte spécifiée.
- CS9243 : impossible d’autoriser un ref struct pour un paramètre de type connu d’autres contraintes comme étant une classe.
- CS9244 : le type peut ne pas être un
ref struct
ou un paramètre de type autorisant un ref struct afin de l’utiliser comme paramètre dans le type générique ou la méthode. - CS9245 : le type ne peut pas implémenter le membre d’interface pour le type
ref struct
. - CS9246 : un membre d’interface d’instance non virtuelle n’est pas accessible sur un paramètre de type qui autorise un ref struct.
- CS9247 : l’instruction foreach ne peut pas fonctionner sur les énumérateurs de type, car il s’agit d’un paramètre de type qui autorise un ref struct et qu’il n’est pas connu au moment de la compilation pour implémenter
IDisposable
. - CS9267 : Le type d’élément d’un itérateur peut ne pas être un struct ref ou un paramètre de type autorisant les structs ref
violations de sécurité de référence
- CS8345 : Le champ ou la propriété implémentée automatiquement ne peut pas être de type , sauf s’il s’agit d’un membre d’instance d’un
ref struct
. - CS9048 : le modificateur
scoped
peut être utilisé uniquement pour les références et les valeursref struct
. - CS9050 : un champ
ref
ne peut pas faire référence à unref struct
. - CS9059 : un champ
ref
ne peut être déclaré que dans unref struct
.
Un type ref struct
peut inclure des champs ref
. Les autres types ne sont pas des champs ref
autorisés. Le compilateur applique des restrictions sur les déclarations et l’utilisation de types ref struct
pour appliquer des règles de sécurité de référence sur les instances de n’importe quel type ref struct
:
- Seuls
ref struct
les types peuvent contenir des propriétés implémentéesref
automatiquement. - Seuls les types
ref struct
ou les variablesref
peuvent avoir le modificateurscoped
. - Un champ
ref
ne peut être déclaré que dans un typeref struct
. - Un champ
ref
ne peut pas faire référence à un typeref struct
/
La violation de ces règles génère l’une des erreurs répertoriées. Si vous avez l’intention d’utiliser cette fonctionnalité de langage, convertissez le type en un ref struct
. Sinon, supprimez le construct non autorisé.
implémentations de l’interface ref struct
- CS8343 :
ref structs
ne peut pas implémenter les interfaces - CS8344 : l’instruction
foreach
ne peut pas fonctionner sur des énumérateurs dans des méthodes asynchrones ou itérateurs, car le type est unref struct
ou un paramètre de type qui autoriseref struct
. - CS9241 : « ref struct » est déjà spécifié.
- CS9242 : la clause de contrainte « allows » doit être la dernière contrainte spécifiée.
- CS9243 : impossible d’autoriser un ref struct pour un paramètre de type connu d’autres contraintes comme étant une classe.
- CS9244 : le type peut ne pas être un
ref struct
ou un paramètre de type autorisant un ref struct afin de l’utiliser comme paramètre dans le type générique ou la méthode. - CS9245 : le type ne peut pas implémenter le membre d’interface pour le type
ref struct
. - CS9246 : un membre d’interface d’instance non virtuelle n’est pas accessible sur un paramètre de type qui autorise un ref struct.
- CS9247 : l’instruction foreach ne peut pas fonctionner sur les énumérateurs de type, car il s’agit d’un paramètre de type qui autorise un ref struct et qu’il n’est pas connu au moment de la compilation pour implémenter
IDisposable
. - CS9267 : Le type d’élément d’un itérateur peut ne pas être un struct ref ou un paramètre de type autorisant les structs ref
Avant C# 13, les types ref struct
ne peuvent pas implémenter d’interfaces ; le compilateur génère CS8343. À compter de C# 13, les types ref struct
peuvent implémenter des interfaces, sous réserve des règles suivantes :
- Impossible de convertir un
ref struct
en instance d’une interface qu’il implémente. Cette restriction inclut la conversion implicite lorsque vous utilisez un typeref struct
comme argument lorsque le paramètre est un type d’interface. La conversion entraîne une conversion boxing qui viole la sécurité de référence. - Un
ref struct
qui implémente une interface doit implémenter tous les membres de l’interface. Leref struct
doit implémenter des membres dans lesquels l’interface inclut une implémentation par défaut.
À compter de C# 13, un ref struct
peut être utilisé comme argument de type pour un paramètre de type générique, si et seulement si le paramètre de type générique a l’anti-contrainte allows ref struct
. Lorsque vous utilisez l’anti-contrainte allows ref struct
, vous devez suivre ces règles :
- Un
ref struct
est utilisé comme argument de type, le paramètre de type doit avoir l’anti-contrainteallows ref struct
.- L’anti-contrainteallows ref struct
doit être la dernière dans la clausewhere
de ce paramètre - Les utilisations des instances dont le paramètre de type doit respecter les règles de sécurité de référence.
- Un
ref struct
ou un argument de type qui peut être unref struct
type ne peut pas être utilisé comme type d’élément pour une méthode d’itérateur.