Partage via


Désolé, erreurs et avertissements associés aux paramètres de référence, aux variables et aux retours

Les erreurs suivantes peuvent être générées lorsque vous travaillez avec des variables de référence :

  • CS0192 : Un readonlychamp ne peut pas être utilisé comme une refou out une valeur (sauf dans un constructeur)
  • CS0199 : Un static readonlychamp ne peut pas être utilisé comme une refou out une valeur (sauf dans un constructeur statique)
  • CS0206 : Une propriété ou un indexeur qui ne retourne pas une référence ne peut pas être utilisé en tant que valeurout ou ref référence de sortie
  • CS0631 : ref et out ne sont pas valides dans ce contexte
  • CS0767 : Désolé, nous n’avons pas pu hériter de l’interface avec les paramètres de type spécifiés, car cela entraîne des surcharges dans la méthode qui diffèrent uniquement au niveau des paramètres ref et out
  • CS1510 : Une valeur ref ou out doit être une variable qui peut être assignée
  • CS1605 : Impossible d’utiliser une variable en tant que valeur ref ou out car elle est en lecture seule
  • CS1623 : Les itérateurs ne peuvent pas avoir ref, in ou out paramètres
  • CS1649 : Les membre d’un champ readonly ne peuvent pas être utilisé comme une refou out une valeur (sauf dans un constructeur)
  • CS1651 : Impossible d’utiliser un champ readonly statique en tant que valeur ref ou out (sauf dans un constructeur statique)
  • CS1655 : Impossible d’utiliser des champs de type en tant que out ou valeurref
  • CS1657 : Impossible d’utiliser une variable comme valeur ou out une valeurref
  • CS1741 : Un paramètre ref ou out ne peut pas avoir de valeur par défaut
  • CS1939 : Impossible de passer la variable de portée en tant que out paramètre ref ou
  • CS1988 : Les méthodes Async n’acceptent pas les ref paramètres in, out ou
  • CS7084 : Un événement Windows Runtime ne peut pas être passé comme out paramètre ref ou .
  • CS8166 : Impossible de retourner un paramètre par référence, car il ne s’agit pas d’un ref paramètre
  • CS8167 : Impossible de retourner un membre de paramètre par référence, car il ne s’agit pas d’un ref paramètre out ou
  • CS8168 : Impossible de retourner la variable locale par référence, car il ne s’agit pas d’une variable locale
  • CS8169 : Impossible de retourner un membre de la variable locale par référence, car il ne s’agit pas d’une variable locale
  • CS8196 : Faire référence à une variable de sorite implicitement typée n’est pas autorisé dans la même liste d’arguments.
  • CS8325 : « await » ne peut pas être utilisé dans une expression contenant un refopérateur conditionnel
  • CS8326 : Les deux valeurs d’opérateur conditionnel doivent être des valeurs. Sinon, aucune d’elles ne doit être une valeurs
  • CS8327 : L’expression doit être de type ’{0}’ pour correspondre à la valeur de remplacement
  • CS8329 : Impossible d’utiliser une out variable en tant que ou valeur, car il s’agit d’une variable en lecture seuleref
  • CS8330 : Les membres de la variable ne peuvent pas être utilisés comme une ref ou out une valeur, car il s’agit d’une variable en lecture seule
  • CS8331 : Impossible d’assigner à variable ou de l’utiliser comme partie droite d’une affectation ref, car il s’agit d’une variable en lecture seule
  • CS8332 : Impossible d’assigner à une membre de variable ou de l’utiliser comme partie droite d’une affectation ref, car il s’agit d’une variable en lecture seule
  • CS8337 : Le premier paramètre d’une méthode d’extension « ref » doit être un type valeur ou un type générique limité à struct.
  • CS8338 :  : Le premier « in » ou « ref readonly » paramètre de la méthode d’extension doit être un type valeur concret (non générique).
  • CS8351 : Les branches d’un opérateur conditionnel ref ne peuvent pas faire référence à des variables ayant des étendues de déclaration incompatibles
  • CS8373 : Le côté gauche d’une affectation ref doit être une variable.
  • CS8374 : La source d’attribution de références ne peut pas avoir une étendue d’échappement plus étroite que la destination.
  • CS8388 : Une variable out ne peut pas être déclarée comme une variable out en tant que variable locale
  • CS8977 : Impossible d’utiliser « ref », « in » ou « out » dans la signature d’une méthode attribuée avec « UnmanagedCallersOnly ».
  • CS9072 : Une variable de déconstruction ne peut pas être déclaré en tant que variable locale
  • CS9077 : Ne peut pas retourner un paramètre par référence par le biais d’un paramètre ref ; il ne peut être retourné que dans une instruction return
  • CS9078 : Impossible de retourner par référence un membre du paramètre par le biais d’un paramètre ref; il ne peut être retourné que dans une instruction return
  • CS9079: Cette référence ne peut pas effectuer une attribution par référence , car la source ne peut échapper à la méthode actuelle qu’à l’aide d’une instruction return.
  • CS9096 : Impossible de re-assigner, car la source a une étendue d’échappement de valeur plus large que la destination autorisant l’affectation via la source de valeurs avec des étendues d’échappement plus étroites que la destination.
  • CS9101 : UnscopedRefAttribute peut être appliqué seulement aux méthodes et propriétés d’instance de struct ou d’interface virtuelle, et ne peut pas être appliqué à des constructeurs ou à des membres init uniquement.
  • CS9102 : UnscopedRefAttribute ne peut pas être appliqué à une implémentation d’interface, car le membre implémenté n’a pas cet attribut.
  • CS9104 : Une usingressource d’instruction using de type ne peut pas être utilisée dans des méthodes asynchrones ou des expressions lambda asynchrones.
  • CS9190 : readonly le modificateur doit être spécifié après ref.
  • CS9199: Un ref readonly paramètre in ne peut pas avoir l’attribut Out.

Les avertissements suivants sont générés lorsque les variables de référence sont utilisées de manière incorrecte :

  • CS9085: Cette variable assigne une variable mais la destination a une étendue d’échappement plus étroite que la source.
  • CS9086 : Les branches d’un opérateur conditionnel reffont référence à des variables ayant des étendues de déclaration incompatibles
  • CS9087: Retourne un paramètre par référence, mais il ne s’agit pas d’un ref paramètre
  • CS9089 : Retourne par référence un membre du paramètre qui n’est pas ref un paramètre out ou
  • CS9091 : Retourne une variable locale par référence, mais il ne s’agit pas d’une variable locale de référence
  • CS9092 : Retourne un membre de la variable locale par référence, mais il ne s’agit pas d’une variable locale de référence
  • CS9093 : Cette ref-assigne mais la source ne peut s’échapper de la méthode actuelle qu’à travers une instruction de retour.
  • CS9094 : Retourne un paramètre par référence par le biais d’un paramètre ref; mais il peut uniquement être retourné en toute sécurité dans une instruction return
  • CS9095 : Retourne par référence un membre du paramètre via un paramètre ref; mais il peut uniquement être retourné en toute sécurité dans une instruction return
  • CS9097 : Cette réaffectation est possible mais la source a une portée d’échappement plus large que la destination, ce qui permet l’affectation par la destination de valeurs ayant des portées d’échappement plus étroites que la source.de données.
  • CS9191 : le modificateur ref pour l’argument correspondant au paramètre in équivaut à in. Considérer l’utilisation de in à la place.
  • CS9192 : L’argument doit être passé avec ref ou in mot clé.
  • CS9193 : L’argument doit être une variable, car elle est passée à un ref readonly paramètre
  • CS9195 : L’argument doit être passé avec le in mot clé
  • CS9196 : Le modificateur de type référence du paramètre ne correspond pas au paramètre correspondant en remplacement ou en membre implémenté.
  • CS9197 : Le modificateur de type référence du paramètre ne correspond pas au paramètre correspondant dans le membre masqué.
  • CS9198 : Le modificateur de type référence du paramètre ne correspond pas au paramètre correspondant dans la cible.
  • CS9200 : Une valeur par défaut est spécifiée pour ref readonly paramètre, mais ref readonly doit être utilisée uniquement pour les références. Songez à déclarer le paramètre comme in.
  • CS9201 : Le champ Ref doit être affecté avant l’utilisation.
  • CS9265 : Le champ n’est jamais affecté à la référence et aura toujours sa valeur par défaut (référence Null)

Ces erreurs et avertissements suivent les thèmes suivants :

Cet article utilise la variable de référence de terme comme terme général pour un paramètre déclaré avec l’un in, ref readonly, refdes modificateurs, ou out variables locales, un ref champ dans un refou un ref struct retour.ref Une variable de référence fait référence à une autre variable, appelée référent.

Syntaxe incorrecte

Ces erreurs indiquent que vous utilisez une syntaxe incorrecte concernant les variables de référence :

  • CS8373 : Le côté gauche d’une affectation ref doit être une variable.
  • CS8388: Une outvariable ne peut pas être déclarée comme une variable out en tant que variable locale.
  • CS9190 : readonly le modificateur doit être spécifié après ref.

Vous pouvez corriger l’erreur avec l’une des modifications suivantes :

  • L’opérande gauche d’un = ref opérateur doit être une variable de référence. Pour plus d’informations sur la syntaxe correcte, consultez les variables de référence.
  • Le modificateur ref readonly de paramètre doit être dans cet ordre. readonly ref n’est pas un modificateur de paramètre légal. Changez l’ordre des mots.
  • Une variable locale ne peut pas être déclarée en tant que out. Pour déclarer une variable de référence locale, utilisez ref.

Restrictions de variable de référence

Les erreurs suivantes indiquent qu’une variable de référence ne peut pas être utilisée où vous en avez une :

  • CS0631 : ref et out ne sont pas valides dans ce contexte
  • CS0767 : Désolé, nous n’avons pas pu hériter de l’interface avec les paramètres de type spécifiés, car cela entraîne des surcharges dans la méthode qui diffèrent uniquement au niveau des paramètres ref et out
  • CS1623 : Les itérateurs ne peuvent pas avoir ref, in ou out paramètres
  • CS1741 : Un ref ou out paramètre ne peut pas avoir de valeur par défaut
  • CS1939 : Impossible de passer la variable de portée en tant que out paramètre ref ou
  • CS1988 : Les méthodes Async n’acceptent pas les ref paramètres in, out ou
  • CS7084 : Un événement Windows Runtime ne peut pas être passé comme out paramètre ref ou .
  • CS8196 : Faire référence à une variable de sorite implicitement typée out n’est pas autorisé dans la même liste d’arguments.
  • CS8325 : « en attente » ne peut pas être utilisé dans une expression contenant un refopérateur conditionnel
  • CS8326 : Les deux valeurs d’opérateur conditionnel doivent être des valeurs. Sinon, aucune d’elles ne doit être une valeurs
  • CS8327 : L’expression doit être de type ’{0}’ pour correspondre à la valeur de remplacement
  • CS8337 : Le premier paramètre d’une méthode d’extension « ref » doit être un type valeur ou un type générique limité à struct.
  • CS8338 :  : Le premier « in » ou « ref readonly » paramètre de la méthode d’extension doit être un type valeur concret (non générique).
  • CS8977 : Impossible d’utiliser « ref », « in » ou « out » dans la signature d’une méthode attribuée avec « UnmanagedCallersOnly ».
  • CS9072 : Une variable de déconstruction ne peut pas être déclaré en tant que variable locale
  • CS9104 : Une usingressource d’instruction using de type ne peut pas être utilisée dans des méthodes asynchrones ou des expressions lambda asynchrones.
  • CS9199 : Un ref readonly paramètre in ne peut pas avoir l’attribut Out.

Les avertissements suivants indiquent qu’une variable de référence ne doit pas être utilisée et peut être dangereuse :

  • CS9196 : Le modificateur de type référence du paramètre ne correspond pas au paramètre correspondant en remplacement ou en membre implémenté.
  • CS9197 : Le modificateur de type référence du paramètre ne correspond pas au paramètre correspondant dans le membre masqué.
  • CS9198 : Le modificateur de type référence du paramètre ne correspond pas au paramètre correspondant dans la cible.
  • CS9200 : Une valeur par défaut est spécifiée pour ref readonly paramètre, mais ref readonly doit être utilisée uniquement pour les références. Songez à déclarer le paramètre comme in.
  • CS9201 : Le champ Ref doit être affecté avant l’utilisation.
  • CS9265 : Le champ n’est jamais affecté à la référence et aura toujours sa valeur par défaut (référence Null)

Pour corriger l’erreur, supprimez la variable de référence où elle n’est pas autorisée :

  • Supprimez in, ref et out paramètres des indexeurs, itérateurs et méthodes asynchrones.
  • Supprimez les expressions conditionnelles ref (? :) qui incluent une attente.
  • Supprimez le ref modificateur du premier paramètre d’une méthode d’extension où ce type n’est pas un type valeur ou un type générique contraint comme type valeur.
  • Les deux ou les deux [expressions d’opérateur conditionnel] doivent être ref variables. Supprimez-la ref d’une expression ou ajoutez-la à l’autre. S’il s’agit d’une ref expression conditionnelle, les deux expressions doivent être du même type.
  • ref et out paramètres ne peuvent pas avoir valeurs par défaut. Supprimez le modificateur ref ou out , ou supprimez la valeur par défaut.
  • Une déclaration de variable implicitement typée out ne peut pas également apparaître ailleurs dans la même liste d’arguments.
  • Vous ne pouvez pas placer de variables de référence dans une instruction using dans async méthodes lambda expressions.
  • La variable de plage dans une expression de requête LINQ ne peut pas être transmise par référence.
  • Il n’est pas possible de déconstruire un objet en variables de référence. Remplacez les variables de référence par des variables de valeur.
  • Vous ne pouvez pas implémenter plusieurs interfaces où les surcharges de méthode diffèrent uniquement sur ref et out. Par exemple, une interface déclare void M(ref int i) et une autre interface déclare void M(out int i). Une classe ne peut pas implémenter les deux interfaces, car les méthodes ne peuvent pas être distinguées. Vous ne pouvez implémenter qu’une de ces interfaces.
  • Les méthodes attribuées avec System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute ne peuvent pas utiliser de paramètres de référence.
  • Un événement Windows Runtime ne peut pas être passé en tant que variable de référence.
  • Un ref readonly paramètre ne peut pas l’appliquer System.Runtime.InteropServices.OutAttribute dans l’API de communication à distance.
  • Initialisez un ref champ dans le constructeur ou en tant qu’initialiseur de champ.

unscoped ref restrictions

Le unscoped qualificateur sur ref les paramètres n’est pas autorisé dans certains emplacements :

  • CS9101 : UnscopedRefAttribute peut être appliqué seulement aux méthodes et propriétés d’instance de struct ou d’interface virtuelle, et ne peut pas être appliqué à des constructeurs ou à des membres init uniquement.
  • CS9102 : UnscopedRefAttribute ne peut pas être appliqué à une implémentation d’interface, car le membre implémenté n’a pas cet attribut.

Vous devez supprimer le unscoped modificateur de la déclaration de paramètre qui a provoqué l’erreur.

Les variables de référence nécessitent un référentiel

Vous devez fournir une variable en tant qu’argument à un paramètre de référence, un retour de référence ou une affectation locale ref :

  • CS0206 : Une propriété ou un indexeur qui ne retourne pas une référence ne peut pas être utilisé en tant que valeurout ou ref référence de sortie
  • CS1510 : Une valeur ref ou out doit être une variable qui peut être assignée

Avertissements :

  • CS9191 : Le ref modificateur pour l’argument correspondant au inparamètre équivaut à in. Considérer l’utilisation de in à la place.
  • CS9192 : L’argument doit être passé avec ref ou in mot clé.
  • CS9193 : L’argument doit être une variable, car elle est passée à un ref readonly paramètre
  • CS9195 : L’argument doit être passé avec le in mot clé

Le compilateur émet ces erreurs lorsque vous utilisez une expression qui calcule une valeur où une variable doit être utilisée. Vous devez stocker le résultat de cette expression dans une variable pour l’utiliser. Par exemple, les propriétés et les indexeurs retournent des valeurs, et non des variables. Vous devez stocker le résultat dans une variable et transmettre une référence à cette variable.

Les variables de référence accessibles en écriture nécessitent un référentiel accessible en écriture

Une variable de référence accessible en écriture nécessite que le référentiel soit également accessible en écriture. Les erreurs suivantes indiquent que la variable n’est pas accessible en écriture :

  • CS0192: Un readonlychamp ne peut pas être utilisé comme une refou out une valeur (sauf dans un constructeur)
  • CS0199 : Un static readonlychamp ne peut pas être utilisé comme une refou out une valeur (sauf dans un constructeur statique)
  • CS1605 : Impossible d’utiliser une variable en tant que valeur ref ou out car elle est en lecture seule
  • CS1649 : Les membre d’un champ readonly ne peuvent pas être utilisé comme une ref ou out une valeur (sauf dans un constructeur)
  • CS1651 : Un static readonlychamp ne peut pas être utilisé comme une ref ou out une valeur (sauf dans un constructeur statique)
  • CS1655 : Impossible d’utiliser des champs de type en tant que ref ou out valeur
  • CS1657 : Impossible d’utiliser une variable comme valeur ou ref une out valeur
  • CS8329 : Impossible d’utiliser une variable en tant que ref ou out valeur, car il s’agit d’une variable en lecture seule
  • CS8330 : Les membres de la variable ne peuvent pas être utilisés comme une ref ou out une valeur, car il s’agit d’une variable en lecture seule
  • CS8331 : Impossible d’assigner à variable ou de l’utiliser comme partie droite d’une affectation ref, car il s’agit d’une variable en lecture seule
  • CS8332 : Impossible d’assigner à une membre de variable ou de l’utiliser comme partie droite d’une affectation ref, car il s’agit d’une variable en lecture seule

Voici quelques exemples de variables qui ne sont pas accessibles en écriture :

Vous devez copier la valeur et passer une référence à la copie.

Violations de sécurité ref

Le compilateur effectue le suivi du contexte sécurisé des références et des variables de référence. Le compilateur émet des erreurs ou des avertissements dans du code non sécurisé, lorsqu’une variable de référence fait référence à une variable de référence qui n’est plus valide. Le référentiel doit avoir un contexte sûr qui est au moins aussi large que le contexte ref safe de la variable de référence. La violation de ces case activée de sécurité signifie que la variable de référence accède à la mémoire aléatoire au lieu de la variable de référence.

  • CS8166 : Impossible de retourner un paramètre par référence, car il ne s’agit pas d’un ref paramètre
  • CS8167 : Impossible de retourner un membre de paramètre par référence, car il ne s’agit pas d’un ref paramètre out ou
  • CS8168 : Impossible de retourner la variable locale par référence, car il ne s’agit pas d’une variable locale
  • CS8169 : Impossible de retourner un membre de la variable locale par référence, car il ne s’agit pas d’une variable locale
  • 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.
  • CS8351 : Les branches d’un opérateur conditionnel ref ne peuvent pas faire référence à des variables ayant des étendues de déclaration incompatibles
  • CS8374 : La source d’attribution de références ne peut pas avoir une étendue d’échappement plus étroite que la destination.
  • CS9077 : Ne peut pas retourner un paramètre par référence par le biais d’un paramètre ref; il ne peut être retourné que dans une instruction return
  • CS9078 : Impossible de retourner par référence un membre du paramètre par le biais d’un paramètre ref; il ne peut être retourné que dans une instruction return
  • CS9079 : Cette référence ne peut pas effectuer une attribution de la source à la destination par référence, car la source ne peut échapper à la méthode actuelle qu’à l’aide d’une instruction return.
  • CS9096 : Impossible de réaffecter de la source à la destination est possible, car la source a une portée d’échappement plus large que la destination, ce qui permet l’affectation par la destination de valeurs ayant des portées d’échappement plus étroites que la source de données.

Avertissements :

  • CS9085 : cette référence affecte la source à la destination, mais la source a une étendue d’échappement plus étroite que la destination.
  • CS9086 : Les branches d’un opérateur conditionnel ref font référence à des variables ayant des étendues de déclaration incompatibles
  • CS9087 : Retourne un paramètre par référence, mais il ne s’agit pas d’un ref paramètre
  • CS9089 : Retourne par référence un membre du paramètre qui n’est pas ref un paramètre out ou
  • CS9091 : Retourne une variable locale par référence, mais il ne s’agit pas d’une variable locale de référence
  • CS9092 : Retourne un membre de la variable locale par référence, mais il ne s’agit pas d’une variable locale de référence
  • CS9093: Cette ref-assigne la source à la destination, mais la source ne peut s’échapper de la méthode actuelle qu’à travers une instruction de retour.
  • CS9094: Retourne un paramètre par référence par le biais d’un paramètre ref; mais il peut uniquement être retourné en toute sécurité dans une instruction return
  • CS9095 : Retourne par référence un membre du paramètre via un paramètre ref; mais il peut uniquement être retourné en toute sécurité dans une instruction return
  • CS9097 : Cette réaffectation de la source à la destination est possible mais la source a une portée d’échappement plus large que la destination, ce qui permet l’affectation par la destination de valeurs ayant des portées d’échappement plus étroites que la source de données.

Le compilateur utilise l’analyse statique pour déterminer si le référentiel est valide à tous les points où la variable de référence peut être utilisée. Vous devez refactoriser le code afin que le référentiel reste valide à tous les emplacements où la variable de référence peut y faire référence. Pour plus d’informations sur les règles de sécurité des références, consultez la norme C# sur les contextes de sécurité ref.