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
readonly
champ ne peut pas être utilisé comme uneref
ouout
une valeur (sauf dans un constructeur) - CS0199 : Un
static readonly
champ ne peut pas être utilisé comme uneref
ouout
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 valeur
out
ouref
référence de sortie - CS0631 :
ref
etout
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
etout
- CS1510 : Une valeur
ref
ouout
doit être une variable qui peut être assignée - CS1605 : Impossible d’utiliser une variable en tant que valeur
ref
ouout
car elle est en lecture seule - CS1623 : Les itérateurs ne peuvent pas avoir
ref
,in
ouout
paramètres - CS1649 : Les membre d’un champ
readonly
ne peuvent pas être utilisé comme uneref
ouout
une valeur (sauf dans un constructeur) - CS1651 : Impossible d’utiliser un champ readonly statique en tant que valeur
ref
ouout
(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
ouout
ne peut pas avoir de valeur par défaut - CS1939 : Impossible de passer la variable de portée en tant que
out
paramètreref
ou - CS1988 : Les méthodes Async n’acceptent pas les
ref
paramètresin
,out
ou - CS7084 : Un événement Windows Runtime ne peut pas être passé comme
out
paramètreref
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ètreout
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 unref
opé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
ouout
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
using
ressource 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èsref
. - 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
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ètreout
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ètrein
équivaut àin
. Considérer l’utilisation dein
à la place. - CS9192 : L’argument doit être passé avec
ref
ouin
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, maisref readonly
doit être utilisée uniquement pour les références. Songez à déclarer le paramètre commein
. - 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 :
- Syntaxe incorrecte : Syntaxe incorrecte : la syntaxe de votre déclaration ou de votre utilisation n’est pas valide.
- Constructions de langage où
ref
les variables ne sont pas valides : certains idiomes C# n’autorisent pas les variables. En règle générale, cela est dû au fait que l’analyse de la sécurité ref ne peut pas être effectuée de manière fiable. - Expression de valeur utilisée lorsqu’une variable de référence est nécessaire : l’expression utilisée comme variable de référence doit être une variable, et non une expression de valeur.
- Variables de référence accessibles en écriture faisant référence à des variables en lecture seule : une référence à une variable en lecture seule ne peut pas être passée par une référence accessible en écriture.
- violations de la sécurité : Une variable de référence ne peut pas faire référence à une variable qui a un contexte plus étroit. Cela signifie que la variable de référence peut faire référence à une mémoire non valide.
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
, ref
des modificateurs, ou out
variables locales, un ref
champ dans un ref
ou 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
out
variable 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èsref
.
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, utilisezref
.
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
etout
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
etout
- CS1623 : Les itérateurs ne peuvent pas avoir
ref
,in
ouout
paramètres - CS1741 : Un
ref
ouout
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ètreref
ou - CS1988 : Les méthodes Async n’acceptent pas les
ref
paramètresin
,out
ou - CS7084 : Un événement Windows Runtime ne peut pas être passé comme
out
paramètreref
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
ref
opé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
using
ressource 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, maisref readonly
doit être utilisée uniquement pour les références. Songez à déclarer le paramètre commein
. - 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
etout
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-laref
d’une expression ou ajoutez-la à l’autre. S’il s’agit d’uneref
expression conditionnelle, les deux expressions doivent être du même type. ref
etout
paramètres ne peuvent pas avoir valeurs par défaut. Supprimez le modificateurref
ouout
, 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
dansasync
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
etout
. Par exemple, une interface déclarevoid M(ref int i)
et une autre interface déclarevoid 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 valeur
out
ouref
référence de sortie - CS1510 : Une valeur
ref
ouout
doit être une variable qui peut être assignée
Avertissements :
- CS9191 : Le
ref
modificateur pour l’argument correspondant auin
paramètre équivaut àin
. Considérer l’utilisation dein
à la place. - CS9192 : L’argument doit être passé avec
ref
ouin
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
readonly
champ ne peut pas être utilisé comme uneref
ouout
une valeur (sauf dans un constructeur) - CS0199 : Un
static readonly
champ ne peut pas être utilisé comme uneref
ouout
une valeur (sauf dans un constructeur statique) - CS1605 : Impossible d’utiliser une variable en tant que valeur
ref
ouout
car elle est en lecture seule - CS1649 : Les membre d’un champ
readonly
ne peuvent pas être utilisé comme uneref
ouout
une valeur (sauf dans un constructeur) - CS1651 : Un
static readonly
champ ne peut pas être utilisé comme uneref
ouout
une valeur (sauf dans un constructeur statique) - CS1655 : Impossible d’utiliser des champs de type en tant que
ref
ouout
valeur - CS1657 : Impossible d’utiliser une variable comme valeur ou
ref
uneout
valeur - CS8329 : Impossible d’utiliser une variable en tant que
ref
ouout
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
ouout
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 :
- champs en lecture seule, tant les champs d’instance que les champs statiques.
- Membres des
readonly
champs. - La variable
this
. - La variable d’itération foreach
- Une variable utilisant ou variable fixe.
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ètreout
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ètreout
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.