Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le compilateur C# génère des erreurs et des avertissements lorsque vous utilisez des types d’enregistrements malveillants. Les types de données fournissent des membres intégrés qui implémentent l’égalité basée sur la valeur. Ces diagnostics vous aident à suivre les règles de déclaration et d’utilisation des types d’enregistrements.
- CS8851 : 'type' définit 'Equals' mais pas 'GetHashCode'
-
CS8857 : Le récepteur d’une
withexpression doit avoir un type non void. - CS8858 : Le type de récepteur 'type' n’est pas un type d’enregistrement valide et n’est pas un type de struct.
- CS8859 : Les membres nommés « Clone » ne sont pas autorisés dans les enregistrements.
- CS8860 : Les types et alias ne doivent pas être nommés « record ».
- CS8864 : Les enregistrements peuvent hériter uniquement de l’objet ou d’un autre enregistrement.
- CS8865 : Seuls les records peuvent hériter d'autres records.
- CS8866 : Le membre d’enregistrement 'member' doit être une propriété d’instance lisible ou un champ de type 'type' pour correspondre au paramètre positionnel 'parameter'.
- CS8869 : 'member' ne remplace pas la méthode attendue de 'object'.
- CS8870 : « membre » ne peut pas être scellé, car l'enregistrement contenant n’est pas scellé.
- CS8871 : 'member' ne remplace pas la méthode attendue de 'type'.
- CS8872: « member » doit permettre le remplacement, car l’enregistrement qui le contient n’est pas verrouillé.
- CS8873: Le membre « member » de l’enregistrement doit être public.
- CS8874: L’élément « member » de l’enregistrement doit renvoyer « type ».
- CS8875 : Le membre d’enregistrement « membre » doit être protégé.
- CS8876 : 'member' ne remplace pas la propriété attendue de 'type'.
- CS8877: Le membre « member » de l’objet Record ne peut pas être statique.
- CS8879: L’élément « member » de l’enregistrement doit être privé.
- CS8906: La propriété « member » du contrat d’égalité doit disposer d’un accesseur get.
- CS8908 : Le type 'type' peut ne pas être utilisé pour un champ d’un enregistrement.
- CS8913 : le membre positionnel 'member' trouvé correspondant à ce paramètre est masqué.
En outre, cet article décrit l’avertissement suivant :
- CS8907 : Le paramètre 'name' n’est pas lus. Avez-vous oublié de l’utiliser pour initialiser la propriété avec ce nom ?
Signatures de membres synthétisées
- CS8869 : 'member' ne remplace pas la méthode attendue de 'object'.
- CS8870 : « membre » ne peut pas être scellé, parce que l'enregistrement qui le contient n’est pas scellé.
- CS8871 : 'member' ne remplace pas la méthode attendue de 'type'.
- CS8872: « member » doit permettre le remplacement, car l’enregistrement qui le contient n’est pas verrouillé.
- CS8873: Le membre « member » de l’enregistrement doit être public.
- CS8874: L’élément « member » de l’enregistrement doit renvoyer « type ».
- CS8875: L’enregistrement « member » doit être protégé.
- CS8876 : 'member' ne remplace pas la propriété attendue de 'type'.
- CS8877: Le membre « member » de l’objet Record ne peut pas être statique.
- CS8879: L’élément « member » de l’enregistrement doit être privé.
- CS8906: La propriété « member » du contrat d’égalité doit disposer d’un accesseur get.
Lorsque vous déclarez explicitement un membre que le compilateur synthétiserait autrement pour un type d’enregistrement, votre déclaration doit correspondre à la signature, à l’accessibilité et aux modificateurs attendus. Pour connaître les règles complètes, consultez la spécification des enregistrements dans la spécification du langage C#.
Pour corriger ces erreurs, appliquez les modifications suivantes à vos membres d’enregistrement déclarés explicitement :
- Modifiez l'accessibilité de la méthode
Equals,GetHashCode,ToString, de la méthode de déconstruction, de la propriétéEqualityContractou des opérateursop_Equalityetop_Inequalityenpublic. Le compilateur exige que ces membres soient accessibles publiquement afin que l’égalité basée sur la valeur fonctionne correctement dans tous les contextes appelants (CS8873). - Modifiez l’accessibilité de la méthode
PrintMembersàprotectedquand vous la déclarez dans un record non scellé. La méthode doit êtreprotectedparce que les enregistrements dérivés la remplacent afin d'inclure leurs propres propriétés dans la sortie mise en forme (CS8875). - Modifiez l’accessibilité de la méthode
PrintMembersàprivatelorsque vous la déclarez dans une classe record scellée ou dans une structure record. Étant donné qu’aucun type dérivé n’existe, la méthode n’a pas besoin d’être accessible en dehors du type (CS8879). - Supprimez le
staticmodificateur de n’importe quel membre synthétisé explicitement déclaré. Les membres synthétisés opèrent sur des instances d’enregistrement spécifiques pour implémenter des comportements tels que la comparaison d’égalité, la mise en forme et la copie, de sorte qu’ils doivent être des membres d’instance (CS8877). - Modifiez le type de retour du membre pour qu’il corresponde au type attendu par le compilateur. Par exemple, la
EqualityContractpropriété doit retournerSystem.Type, et laEqualsméthode doit retournerbool. Le compilateur s’appuie sur ces types de retour exacts pour générer du code correct pour l’égalité et d’autres comportements synthétisés (CS8874). - Supprimez le
sealedmodificateur de tout membre synthétisé explicitement déclaré dans un enregistrement non scellé. Les enregistrements dérivés doivent pouvoir remplacer ces membres pour fournir leur propre logique d’égalité et de mise en forme basée sur la valeur (CS8870). - Déclarez explicitement les membres synthétisés fournis comme
virtualouoverridedans un record non scellé. Le compilateur exige que ces membres autorisent la substitution afin que les enregistrements dérivés dans la hiérarchie d’héritage puissent personnaliser leur comportement (CS8872). - Veillez à ce que votre membre explicitement déclaré réalise bien le remplacement de la méthode attendue de
objectou du type d’enregistrement parent. Par exemple, laEqualsméthode doit remplacerobject.EqualsetGetHashCodedoit remplacerobject.GetHashCode. Le compilateur vérifie que ces membres participent à la chaîne de remplacement correcte afin que l’égalité basée sur la valeur et d’autres comportements synthétisés fonctionnent correctement dans la hiérarchie de types (CS8869, CS8871). - Assurez-vous que votre propriété
EqualityContractexplicitement déclarée remplace la propriétéEqualityContractde l’enregistrement de base. Le compilateur utilise la chaîne de remplacement du contrat d’égalité afin de différencier les types d’enregistrement à l’exécution au sein de la hiérarchie d’héritage (CS8876). - Ajoutez un accesseur
getà la propriétéEqualityContract. Le compilateur lit le contrat d’égalité au moment de l’exécution pour déterminer si deux instances d’enregistrement sont du même type, de sorte que la propriété doit être lisible (CS8906).
Membres positionnels
- CS8866: Le membre « member » de l’enregistrement doit être une propriété ou un champ d’instance accessible en lecture de type « type » pour correspondre au paramètre de position « parameter ».
- CS8907 : Le paramètre 'name' n’est pas lus. Avez-vous oublié de l’utiliser pour initialiser la propriété avec ce nom ?
- CS8908 : Le type 'type' peut ne pas être utilisé pour un champ d’un enregistrement.
- CS8913 : le membre positionnel 'member' trouvé correspondant à ce paramètre est masqué.
Lorsque vous déclarez un enregistrement positionnel, le compilateur synthétise les propriétés qui correspondent à chaque paramètre positionnel. Ces diagnostics indiquent que vos déclarations explicites sont en conflit avec ces propriétés synthétisées. Pour connaître les règles complètes, consultez la spécification des enregistrements dans la spécification du langage C#.
Pour corriger ces erreurs, appliquez les modifications suivantes à vos déclarations d’enregistrement positionnel :
- Modifiez tout membre déclaré explicitement qui correspond à un paramètre positionnel afin qu’il s’agit d’une propriété ou d’un champ d’instance lisible avec le même type que le paramètre. Le compilateur a besoin que le membre soit lisible et compatible avec le type afin que la méthode synthétisée
Deconstructet la correspondance de modèle positionnel puissent accéder correctement à la valeur (CS8866). - Vérifiez que chaque paramètre positionnel initialise sa propriété correspondante dans le corps du constructeur lorsque vous fournissez un constructeur explicite. Le compilateur déclenche un avertissement lorsqu’un paramètre n’est pas utilisé, car il indique généralement une faute de frappe ou une incompatibilité entre le nom du paramètre et le nom de la propriété, ce qui laisse la propriété non initialisée (CS8907).
- Remplacez le type d’un champ déclaré dans un enregistrement par un type valide dans ce contexte. Certains types, tels que
Span<T>ou d’autresref structtypes, ne peuvent pas être utilisés comme champs dans un enregistrement, car les types d’enregistrements nécessitent que tous les champs soient compatibles avec l’allocation de tas et l’égalité basée sur la valeur (CS8908). - Supprimez le modificateur
newd’un membre dans un enregistrement dérivé qui masque un membre positionnel de l’enregistrement de base. Lorsqu’un membre positionnel est masqué, le compilateur ne peut pas correspondre au paramètre positionnel à sa propriété correspondante, ce qui interrompt la méthode synthétiséeDeconstructet la correspondance de modèle positionnel (CS8913).
Membres d’égalité
- CS8851 : 'type' définit 'Equals' mais pas 'GetHashCode'
-
CS8857 : Le récepteur d’une
withexpression doit avoir un type non void. - CS8858 : Le type de récepteur 'type' n’est pas un type d’enregistrement valide et n’est pas un type de struct.
Les types d’enregistrements fournissent une égalité intégrée basée sur la valeur. Ces diagnostics se produisent lorsque vos déclarations sont en conflit avec le contrat d’égalité. Pour connaître les règles complètes sur l’égalité, consultez les comparaisons d’égalité.
Pour corriger ces erreurs, appliquez les modifications suivantes :
- Ajoutez une
GetHashCodeméthode chaque fois que vous définissez uneEqualsméthode. Le contrat d’égalité exige que les objets considérés comme égaux produisent le même code de hachage. Le compilateur applique donc que ces deux méthodes sont toujours définies ensemble (CS8851). - Modifiez le récepteur d’une
withexpression afin qu'il s'agisse d’un type d’enregistrement ou d'un type de "struct". L’expressionwithgénère une copie modifiée à l’aide du constructeur de copierecordou de la sémantique de copie par valeur pour les typesstruct(CS8858). - Vérifiez que le récepteur d’une
withexpression a un type non void. L’expressionwithproduit une nouvelle copie du récepteur, de sorte que le récepteur doit évaluer une valeur qui peut être copiée (CS8857).
Héritage d’enregistrement
- CS8864 : Les enregistrements peuvent hériter uniquement de l’objet ou d’un autre enregistrement
- CS8865 : seuls les enregistrements peuvent hériter des enregistrements.
Les types de classes d’enregistrement suivent des règles d’héritage spécifiques. Pour connaître les règles complètes, consultez la spécification des enregistrements dans la spécification du langage C#.
Pour corriger ces erreurs, appliquez les modifications suivantes :
- Modifiez le type de base d’une classe d’enregistrement afin qu’elle hérite de
objectou d’une autre classe d’enregistrement. Les types d’enregistrements s’appuient sur les membres synthétisés par le compilateur pour l’égalité et la copie, qui ne sont compatibles qu’avec d’autres types d’enregistrements. Par conséquent, le compilateur n’autorise pas qu’un enregistrement puisse hériter d’une classe qui n’est pas de type enregistrement (CS8864). - Modifiez une classe non-enregistrement qui hérite d’une classe d’enregistrement afin qu’elle soit déclarée en tant que classe d’enregistrement à la place. Étant donné que les types d’enregistrements synthétisent l’égalité, le clonage et d’autres membres qui dépendent d’une chaîne d’héritage cohérente, le compilateur exige que chaque type de la hiérarchie soit une classe d’enregistrement (CS8865). Les types struct d'enregistrement ne peuvent pas participer aux hiérarchies d'héritage au-delà de l'implémentation d'interfaces.
Noms de membres réservés
- CS8859 : Les membres nommés « Clone » ne sont pas autorisés dans les enregistrements.
- CS8860 : Les types et alias ne doivent pas être nommés « record ».
Le compilateur réserve certains noms à utiliser avec les types d’enregistrements. Pour connaître les règles complètes, consultez la spécification des enregistrements dans la spécification du langage C#.
Pour corriger ces erreurs, appliquez les modifications suivantes :
- Renommez tout membre appelé
Clonedans un type d’enregistrement en un autre nom. Le compilateur utiliseCloneen interne pour implémenter la sémantique de copie des expressionswith, de sorte que vos propres membresCloneentrent en conflit avec l’implémentation synthétisée (CS8859). - Renommez n’importe quel type ou alias nommé
recorden un autre nom. Étant donné qu’ilrecords’agit d’un mot clé contextuel utilisé pour déclarer des types d’enregistrements, le nommage d’un type ou d’un aliasrecordcrée une ambiguïté qui peut confondre le compilateur et les développeurs qui lisent le code (CS8860).