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.
Cet article traite des erreurs suivantes du compilateur :
- CS0193 : L’opérateur * ou -> doit être appliqué à un pointeur de données
- CS0196 : un pointeur doit être indexé par une seule valeur
- CS0208 : Impossible de prendre l’adresse, d’obtenir la taille ou de déclarer un pointeur vers un type managé ('type')
- CS0209 : Le type de local déclaré dans une instruction fixe doit être un type de pointeur
-
CS0210 : Vous devez fournir un initialiseur dans une déclaration fixe ou
usingd’instruction - CS0211 : Impossible de prendre l’adresse de l’expression donnée
- CS0212 : Vous ne pouvez prendre l’adresse d’une expression non corrigée qu’à l’intérieur d’un initialiseur d’instruction fixe
- CS0213 : Vous ne pouvez pas utiliser l’instruction fixe pour prendre l’adresse d’une expression déjà fixe
- CS0214 : Les pointeurs et les mémoires tampons de taille fixe peuvent uniquement être utilisés dans un contexte non sécurisé
- CS0227 : Le code non sécurisé ne peut apparaître que lors de la compilation avec /unsafe
- CS0233 : 'identificateur' n’a pas de taille prédéfinie. Par conséquent, la tailleof ne peut être utilisée que dans un contexte non sécurisé
- CS0242 : L’opération en question n’est pas définie sur les pointeurs void
-
CS0244 : Ni '
is' ni 'as' n’est valide sur les types de pointeur - CS0254 : Le côté droit d’une affectation d’instruction fixe peut ne pas être une expression cast
- CS0459 : Impossible de prendre l’adresse d’une variable locale en lecture seule
- CS0821 : Les locaux implicitement typés ne peuvent pas être corrigés
- CS1641 : Un champ de mémoire tampon de taille fixe doit avoir le spécificateur de taille de tableau après le nom du champ
- CS1642 : Les champs de mémoire tampon de taille fixe peuvent uniquement être membres de structs.
- CS1656 : Impossible d’affecter à « variable », car il s’agit d’un « type de variable en lecture seule »
-
CS1663 : Type de mémoire tampon de taille fixe doit être l’un des éléments suivants :
bool, ,byteshort,intlong, ,char,sbyte, , ouushortuintulongfloatdouble - CS1665 : Les mémoires tampons de taille fixe doivent avoir une longueur supérieure à zéro
- CS1666 : Vous ne pouvez pas utiliser de mémoires tampons de taille fixe contenues dans des expressions non corrigées. Essayez d’utiliser l’instruction fixe.
- CS1708 : Les mémoires tampons de taille fixe sont accessibles uniquement par le biais de locaux ou de champs
-
CS1716 : N’utilisez pas l’attribut '
System.Runtime.CompilerServices.FixedBuffer'. Utilisez le modificateur de champ « fixe » à la place. - CS1919 : Le type non sécurisé 'nom de type' ne peut pas être utilisé dans la création d’objets.
-
CS4004 : Impossible
awaitdans un contexte non sécurisé -
CS8812 : Impossible de convertir le
&Methodgroupe en type pointeur non de fonction. - CS9049 : Un champ fixe ne doit pas être un champ ref.
-
CS9123 : L’opérateur '
&' ne doit pas être utilisé sur les paramètres ou les variables locales dans les méthodes asynchrones.
Opérations de pointeur et déréférencement
-
CS0193 : L’opérateur
*ou l’opérateur->doit être appliqué à un pointeur de données - CS0196 : un pointeur doit être indexé par une seule valeur
- CS0242 : L’opération en question n’est pas définie sur les pointeurs void
Pour utiliser correctement les opérations de pointeur, suivez les règles de déreferencing, d’indexation et d’opérations arithmétiques. Pour plus d’informations, consultez Les types de pointeurs et les pointeurs de fonction.
- Appliquez l'opérateur
*ou l'opérateur->uniquement aux pointeurs de données (CS0193). N’utilisez pas ces opérateurs avec des types non-pointeurs ou des pointeurs de fonction. Contrairement à C/C++, vous ne pouvez pas déréférer les pointeurs de fonction en C#. - Pointeurs d’index avec une seule valeur (CS0196). L’indexation multidimensionnelle n’est pas prise en charge sur les pointeurs.
- Évitez les opérations qui ne sont pas définies sur les pointeurs void (CS0242). Par exemple, n’incrémentez pas de pointeur void, car le compilateur ne connaît pas la taille des données vers lesquelles il pointe.
Types de pointeur et types managés
- CS0208 : Impossible de prendre l’adresse, d’obtenir la taille ou de déclarer un pointeur vers un type managé ('type')
- CS0233 : 'identificateur' n’a pas de taille prédéfinie. Par conséquent, la tailleof ne peut être utilisée que dans un contexte non sécurisé
Pour travailler correctement avec des pointeurs et l’opérateur sizeof , utilisez des types non managés et des contextes appropriés. Pour plus d’informations, consultez Types non managés et sizeof opérateur.
- Utilisez des pointeurs uniquement avec des types non managés (CS0208). Ne prenez pas l'adresse de, ne déterminez pas la taille de, et ne déclarez pas de pointeurs vers des types gérés. Les types managés incluent des types de référence et des structs qui contiennent des champs ou des propriétés de type de référence.
- Utilisez l’opérateur dans un
sizeofcontexte lors de l’utilisation de types dont la taille n’est pas une constante au moment de launsafecompilation (CS0233).
Tampons fixes
- CS0209 : Le type de local déclaré dans une instruction fixe doit être un type de pointeur
-
CS0210 : Vous devez fournir un initialiseur dans une déclaration fixe ou
usingd’instruction - CS0211 : Impossible de prendre l’adresse de l’expression donnée
- CS0212 : Vous ne pouvez prendre l’adresse d’une expression non corrigée qu’à l’intérieur d’un initialiseur d’instruction fixe
- CS0213 : Vous ne pouvez pas utiliser l’instruction fixe pour prendre l’adresse d’une expression déjà fixe
- CS0254 : Le côté droit d’une affectation d’instruction fixe peut ne pas être une expression cast
- CS0459 : Impossible de prendre l’adresse d’une variable locale en lecture seule
- CS0821 : Les variables locales implicitement typées ne peuvent pas être fixées
- CS1656 : Impossible d’affecter à « variable », car il s’agit d’un « type de variable en lecture seule »
Ces erreurs se produisent lorsque vous utilisez l’instructionfixed de manière incorrecte. L’instruction fixed empêche le garbage collector de déplacer une variable mobile et déclare un pointeur vers cette variable. Pour plus d’informations, consultez Code et pointeurs non sécurisés.
Pour utiliser correctement l’instruction fixed :
- Déclarez la variable en tant que type de pointeur (CS0209).
- Fournissez un initialiseur dans la déclaration d’instruction
fixed(CS0210). - Prenez l’adresse uniquement des expressions valides : champs, variables locales et indirection de pointeur (CS0211). Ne prenez pas l’adresse des expressions calculées comme la somme de deux variables.
- Utilisez l’opérateur address-of sur les expressions nonfixées uniquement dans l’initialiseur
fixedd’instruction (CS0212). - N’utilisez pas d’instruction
fixedsur des expressions déjà fixes (CS0213). Les variables locales et les paramètres d’une méthodeunsafesont déjà positionnés sur la pile. - N’utilisez pas d’expressions de cast du côté droit d’une instruction d’affectation
fixed(CS0254). - Ne prenez pas l’adresse des variables locales en lecture seule (CS0459). Les variables dans
foreachles boucles,usingles instructions etfixedles déclarations sont en lecture seule. - Utilisez des types explicites au lieu d’instructions
varfixed(CS0821). - N’assignez pas de variables dans des contextes en lecture seule, tels que les boucles
foreach, les instructions ifusing, ou les instructions forfixed(CS1656).
Restrictions de contexte non sécurisées
- CS0214 : Les pointeurs et les mémoires tampons de taille fixe peuvent uniquement être utilisés dans un contexte non sécurisé
- CS0227 : Le code non sécurisé ne peut apparaître que si la compilation se fait avec /unsafe
- CS0244 : Ni 'is' ni 'as' n’est valide sur les types de pointeur
- CS1919 : Le type non sécurisé 'nom de type' ne peut pas être utilisé dans la création d’objets
- CS4004 : Impossible d’attendre dans un contexte non sécurisé
- CS9123 : L’opérateur '&' ne doit pas être utilisé sur les paramètres ou les variables locales dans les méthodes asynchrones
Ces erreurs se produisent lorsque vous utilisez des constructions de code non sécurisées sans contexte non sécurisé approprié ou lorsque vous tentez des opérations qui ne sont pas autorisées dans le code non sécurisé. Pour plus d’informations, consultez Code et pointeurs non sécurisés et mot unsafe clé.
Pour utiliser le code non sécurisé correctement :
- Marquez des méthodes, des types ou des blocs de code qui utilisent des pointeurs ou des mémoires tampons de taille fixe à l’aide du
unsafemot clé (CS0214). - Activez l’option du compilateur AllowUnsafeBlocks dans les paramètres de votre projet lors de l’utilisation du
unsafemot clé (CS0227). - N’utilisez pas les opérateurs
isouasavec des types de pointeur (CS0244). Ces opérateurs de test de type ne sont pas valides pour les pointeurs. - N’utilisez pas l’opérateur
newpour créer des instances de type pointeur (CS1919). Pour créer des objets en mémoire non managée, utilisez l’interopérabilité pour appeler des méthodes natives qui retournent des pointeurs. - Séparez le code non sécurisé du code asynchrone (CS4004). Créez des méthodes distinctes pour les opérations non sécurisées et appelez-les à partir de méthodes asynchrones.
- N’utilisez pas l’opérateur d’adresse (
&) sur les paramètres ou les variables locales dans les méthodes asynchrones (CS9123). La variable n’existe peut-être pas lorsque l’opération asynchrone se termine.
Mémoires tampons de taille fixe
- CS1641 : Un champ de mémoire tampon de taille fixe doit avoir le spécificateur de taille de tableau après le nom du champ
- CS1642 : Les champs de mémoire tampon de taille fixe peuvent uniquement être membres de structs
- CS1663 : Le type de mémoire tampon de taille fixe doit être l’un des éléments suivants : bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float ou double
- CS1665 : Les mémoires tampons de taille fixe doivent avoir une longueur supérieure à zéro
- CS1666 : Vous ne pouvez pas utiliser de mémoires tampons de taille fixe contenues dans des expressions non corrigées. Essayer d’utiliser l’instruction fixe
- CS1708 : Les mémoires tampons de taille fixe sont accessibles uniquement par le biais de locaux ou de champs
- CS1716 : n’utilisez pas l’attribut « System.Runtime.CompilerServices.FixedBuffer ». Utilisez le modificateur de champ « fixe » à la place
- CS9049 : Un champ fixe ne doit pas être un champ ref
Ces erreurs se produisent lorsque vous travaillez avec des mémoires tampons de taille fixe. Les mémoires tampons de taille fixe sont des tableaux incorporés directement dans des structs et sont principalement utilisés pour les scénarios d’interopérabilité. Pour plus d’informations, consultez Mémoires tampons de taille fixe.
Pour déclarer et utiliser correctement des mémoires tampons de taille fixe :
- Spécifiez la taille du tableau après le nom du champ à l’aide d’une constante entière positive (CS1641, CS1665).
- Déclarez les mémoires tampons de taille fixe uniquement dans les structs, et non dans les classes (CS1642). Utilisez un tableau standard si vous avez besoin du champ dans une classe.
- Utilisez l’un des types d’éléments pris en charge :
bool,byteshortintlongcharsbyteushortuint, , ,ulong,floatoudouble(CS1663). - Utilisez une
fixedinstruction pour épingler la structure conteneur avant d’accéder à la mémoire tampon (CS1666). - Accédez aux mémoires tampons de taille fixe uniquement par le biais de locaux ou de champs, et non par le biais d’expressions intermédiaires (CS1708).
- Utilisez le
fixedmodificateur de champ au lieu de l’attributSystem.Runtime.CompilerServices.FixedBuffer(CS1716). - Ne déclarez pas de mémoires tampons de taille fixe en tant que
refchamps (CS9049). Les mémoires tampons de taille fixe doivent être des champs de valeur.
Pointeurs fonction
-
CS8812 : Impossible de convertir le groupe en
&Methodtype pointeur non de fonction
Pour obtenir un pointeur de fonction, utilisez l’opérateur d’adresse avec un cast de type de pointeur de fonction explicite. N'utilisez pas l'opérateur d'adresse & pour affecter des groupes de méthodes à void* ou à d'autres types de pointeurs qui ne sont pas des pointeurs de fonction. Pour plus d’informations, consultez pointeurs de fonction.