Partage via


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 un ref struct ou un paramètre de type qui autorise ref 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 valeurs ref struct.
  • CS9050 : un champ ref ne peut pas faire référence à un ref 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 valeurs ref struct.
  • CS9050 : un champ ref ne peut pas faire référence à un ref struct.
  • CS9059 : un champ ref ne peut être déclaré que dans un ref 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ées ref automatiquement.
  • Seuls les types ref struct ou les variables ref peuvent avoir le modificateur scoped.
  • Un champ ref ne peut être déclaré que dans un type ref struct.
  • Un champ ref ne peut pas faire référence à un type ref 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 un ref struct ou un paramètre de type qui autorise 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

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 type ref 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. Le ref 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-contrainte allows ref struct .- L’anti-contrainte allows ref struct doit être la dernière dans la clause where 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 un ref struct type ne peut pas être utilisé comme type d’élément pour une méthode d’itérateur.