Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se tratan los siguientes errores del compilador:
- CS0193: El operador * o -> debe aplicarse a un puntero de datos
- CS0196: un puntero debe indexarse solo con un valor.
- CS0208: no se puede tomar la dirección de, obtener el tamaño de, o declarar un puntero a un tipo administrado («tipo»)
- CS0209: el tipo de local declarado en una instrucción fija debe ser un tipo de puntero.
-
CS0210: debe proporcionar un inicializador en una declaración fija o
usingde instrucción. - CS0211: No se puede tomar la dirección de la expresión dada.
- CS0212: solo puede tomar la dirección de una expresión sin fijar dentro de un inicializador de instrucción fijo.
- CS0213: no se puede usar la instrucción fija para tomar la dirección de una expresión ya fija
- CS0214: los punteros y los búferes de tamaño fijo solo se pueden usar en un contexto no seguro
- CS0227: El código no seguro solo puede aparecer si se compila con /unsafe
- CS0233: 'identifier' no tiene un tamaño predefinido, por lo que sizeof solo se puede usar en un contexto no seguro.
- CS0242: La operación en cuestión no está definida en punteros void
-
CS0244: Ni '
is' ni 'as' son válidos en los tipos de puntero - CS0254: Es posible que el lado derecho de una asignación de instrucción fija no sea una expresión de conversión.
- CS0459: No se puede tomar la dirección de una variable local de solo lectura
- CS0821: No se pueden corregir variables locales con tipo implícito
- CS1641: un campo de búfer de tamaño fijo debe tener el especificador de tamaño de matriz después del nombre del campo
- CS1642: los campos de búfer de tamaño fijo solo pueden ser miembros de estructuras.
- CS1656: No se puede asignar a "variable" porque es un tipo de variable de solo lectura.
-
CS1663: El tipo de búfer de tamaño fijo debe ser uno de los siguientes:
bool,byte,shortintlongchar,sbyte,ushort, , ouintulongfloatdouble - CS1665: Los búferes de tamaño fijo deben tener una longitud mayor que cero
- CS1666: no se pueden usar búferes de tamaño fijo contenidos en expresiones sin fijar. Pruebe a usar la instrucción fija.
- CS1708: solo se puede acceder a los búferes de tamaño fijo a través de variables locales o campos
-
CS1716: No use el atributo '
System.Runtime.CompilerServices.FixedBuffer'. Use el modificador de campo 'fixed' en su lugar. - CS1919: No se puede usar el tipo no seguro 'nombre de tipo' en la creación de objetos.
-
CS4004: No se puede
awaiten un contexto no seguro -
CS8812: No se puede convertir el
&Methodgrupo a un tipo de puntero no funcional. - CS9049: un campo fijo no debe ser un campo ref.
-
CS9123: el operador '
&' no debe usarse en parámetros ni variables locales en métodos asincrónicos.
Operaciones de puntero y desreferenciación
-
CS0193: el
*o->operador se debe aplicar a un puntero de datos - CS0196: un puntero debe indexarse solo con un valor.
- CS0242: La operación en cuestión no está definida en punteros void
Para usar correctamente las operaciones de puntero, siga las reglas para desreferenciar, indexar y operaciones aritméticas. Para obtener más información, vea Tipos de puntero y punteros de función.
- Aplique el
*operador o->solo a punteros de datos (CS0193). No use estos operadores con tipos que no sean de puntero o punteros de función. A diferencia de C/C++, no se pueden desreferenciar punteros de función en C#. - Punteros de índice con un solo valor (CS0196). La indexación multidimensional no es compatible con punteros.
- Evite las operaciones que no están definidas en punteros void (CS0242). Por ejemplo, no incremente un puntero void porque el compilador no conoce el tamaño de los datos a los que se apunta.
Tipos de puntero y tipos administrados
- CS0208: no se puede tomar la dirección de, obtener el tamaño de o declarar un puntero a un tipo administrado ('type')
- CS0233: 'identifier' no tiene un tamaño predefinido, por lo que sizeof solo se puede usar en un contexto no seguro.
Para trabajar con punteros y el sizeof operador correctamente, use tipos no administrados y contextos adecuados. Para obtener más información, vea Tipos no administrados y el sizeof operador .
- Use punteros solo con tipos no administrados (CS0208). No tome la dirección de, obtenga el tamaño de, ni declare punteros a tipos administrados. Los tipos administrados incluyen tipos de referencia y estructuras que contienen campos o propiedades de tipo de referencia.
- Use el
sizeofoperador dentro de ununsafecontexto al trabajar con tipos cuyo tamaño no sea una constante en tiempo de compilación (CS0233).
Búferes fijos
- CS0209: el tipo de local declarado en una instrucción fija debe ser un tipo de puntero.
-
CS0210: debe proporcionar un inicializador en una declaración fija o
usingde instrucción. - CS0211: No se puede tomar la dirección de la expresión dada.
- CS0212: solo puede tomar la dirección de una expresión sin fijar dentro de un inicializador de instrucción fijo.
- CS0213: no se puede usar la instrucción fija para tomar la dirección de una expresión ya fija
- CS0254: Es posible que el lado derecho de una asignación de instrucción fija no sea una expresión de conversión.
- CS0459: No se puede tomar la dirección de una variable local de solo lectura
- CS0821: No se pueden corregir variables locales con tipo implícito
- CS1656: No se puede asignar a "variable" porque es un tipo de variable de solo lectura.
Estos errores se producen cuando se usa la fixed instrucción incorrectamente. La fixed instrucción impide que el recolector de basura reubique una variable móvil y declara un puntero a esa variable. Para obtener más información, consulte Código no seguro y punteros.
Para usar correctamente la fixed instrucción :
- Declare la variable como un tipo de puntero (CS0209).
- Proporcione un inicializador en la declaración de la sentencia
fixed(CS0210). - Tome la dirección solo de expresiones válidas: campos, variables locales y direccionamiento indirecto de puntero (CS0211). No toméis la referencia de las expresiones calculadas, como la suma de dos variables.
- Usa el operador de referencia de dirección en expresiones no fijadas solo dentro del inicializador de instrucciones
fixed(CS0212). - No use una
fixedinstrucción en expresiones ya fijas (CS0213). Las variables locales y los parámetros de ununsafemétodo ya están fijos en la pila. - No use expresiones de conversión en el lado derecho de una
fixedasignación de instrucción (CS0254). - No tome la dirección de las variables locales de solo lectura (CS0459). Las variables en
foreachbucles,usinginstrucciones efixedinstrucciones son de solo lectura. - Use tipos explícitos en lugar de
varenfixedinstrucciones (CS0821). - No asigne variables en contextos de solo lectura, como
foreachbucles,usinginstrucciones ofixedinstrucciones (CS1656).
Restricciones de contexto no seguras
- CS0214: los punteros y los búferes de tamaño fijo solo se pueden usar en un contexto no seguro
- CS0227: El código no seguro solo puede aparecer si se compila con /unsafe
- CS0244: Ni 'is' ni 'as' son válidos en tipos de puntero
- CS1919: No se puede usar el tipo no seguro 'nombre de tipo' en la creación de objetos
- CS4004: No se puede aguardar en un contexto no seguro
- CS9123: El operador '&' no debe usarse en parámetros ni variables locales en métodos asincrónicos
Estos errores se producen cuando se usan construcciones de código no seguras sin un contexto no seguro adecuado o cuando se intentan operaciones que no están permitidas en código no seguro. Para obtener más información, vea Código no seguro y punteros y la unsafe palabra clave .
Para usar código no seguro correctamente:
- Marcar métodos, tipos o bloques de código que usan punteros o búferes de tamaño fijo mediante la
unsafepalabra clave (CS0214). - Habilite la opción del compilador AllowUnsafeBlocks en la configuración del proyecto al usar la
unsafepalabra clave (CS0227). - No use los operadores
isoascon tipos de punteros (CS0244). Estos operadores de prueba de tipos no son válidos para punteros. - No use el
newoperador para crear instancias de tipo de puntero (CS1919). Para crear objetos en memoria no administrada, use la interoperabilidad para llamar a métodos nativos que devuelven punteros. - Mantenga el código no seguro separado del código asincrónico (CS4004). Cree métodos independientes para operaciones no seguras y llámelos desde métodos asincrónicos.
- No use el operador address-of (
&) en parámetros o variables locales en métodos asincrónicos (CS9123). Es posible que la variable no exista cuando se complete la operación asincrónica.
Búferes de tamaño fijo
- CS1641: un campo de búfer de tamaño fijo debe tener el especificador de tamaño de matriz después del nombre del campo
- CS1642: los campos de búfer de tamaño fijo solo pueden ser miembros de estructuras
- CS1663: El tipo de búfer de tamaño fijo debe ser uno de los siguientes: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float o double
- CS1665: los búferes de tamaño fijo deben tener una longitud mayor que cero
- CS1666: no se pueden usar búferes de tamaño fijo contenidos en expresiones sin fijar. Pruebe a usar la instrucción fija.
- CS1708: solo se puede acceder a los búferes de tamaño fijo a través de variables locales o campos
- CS1716: No use el atributo "System.Runtime.CompilerServices.FixedBuffer". Use el modificador de campo 'fixed' en su lugar.
- CS9049: Un campo fijo no debe ser un campo ref
Estos errores ocurren cuando trabajas con buffers de tamaño fijo. Los búferes de tamaño fijo son matrices incrustadas directamente en estructuras y se usan principalmente para escenarios de interoperabilidad. Para obtener más información, consulte Búferes de tamaño fijo.
Para declarar y usar búferes de tamaño fijo correctamente:
- Especifique el tamaño de la matriz después del nombre del campo mediante una constante entera positiva (CS1641, CS1665).
- Declare buffers de tamaño fijo solo en estructuras, no en clases (CS1642). Utiliza un array regular si necesitas el campo en una clase.
- Use uno de los tipos de elementos admitidos:
bool,byte,shortintlongcharsbyteushort,uint, ,ulong,floatodouble(CS1663). - Use una
fixedinstrucción para anclar la estructura contenedora antes de acceder al búfer (CS1666). - Acceda a búferes de tamaño fijo solo a través de variables locales o campos, no a través de expresiones intermedias (CS1708).
- Use el
fixedmodificador de campo en lugar delSystem.Runtime.CompilerServices.FixedBufferatributo (CS1716). - No declare búferes de tamaño fijo como
refcampos (CS9049). Los búferes de tamaño fijo deben ser campos de valor.
Punteros de función
-
CS8812: No se puede convertir
&Methodel grupo en un tipo de puntero que no sea de función
Para obtener un puntero de función, use el operador address-of con una conversión explícita del tipo de puntero de función. No utilice el operador de dirección & para asignar grupos de métodos a void* u otros tipos de puntero que no sean de función. Para obtener más información, vea Punteros de función.