Resolución de errores y advertencias con declaraciones de matriz insertadas
En este artículo se tratan los siguientes errores y advertencias del compilador:
- CS9164: No se puede convertir la expresión en
Span<T>
porque no es una variable asignable - CS9165: No se puede convertir la expresión en
ReadOnlySpan<T>
porque es posible que no se pase o se devuelva por referencia - CS9166: El índice está fuera de los límites de la matriz insertada
- CS9167: La longitud de matriz insertada debe ser mayor que 0.
- CS9168: La estructura de la matriz insertada no debe tener un diseño explícito.
- CS9169: La estructura de matriz insertada debe declarar uno y solo un campo de instancia que no debe ser un campo ref.
- CS9172: Solo se puede tener acceso a los elementos de un tipo de matriz insertada con un único argumento implícitamente convertible a
int
,System.Index
oSystem.Range
. - CS9173: Un acceso de matriz no puede tener un especificador de argumento con nombre
- CS9180: El campo de elemento de la matriz insertada no se puede declarar como obligatorio, de solo lectura, volátil o como un búfer de tamaño fijo.
- CS9181: El indexador de matriz insertada no se usará para la expresión de acceso a elementos.
- CS9182: El método "Sector" de matriz insertada no se usará para la expresión de acceso a elementos.
- CS9183: El operador de conversión de matriz insertada no se usará para la conversión de la expresión del tipo declarante.
- CS9184: No se admite la característica de lenguaje "Matrices insertadas" para los tipos de matriz insertados con campo de elemento que es un campo "
ref
" o tiene un tipo que no es válido como argumento de tipo. - CS9189: No se admite la instrucción
foreach
en una matriz insertada de tipo - CS9259: el atributo System.Runtime.CompilerServices.InlineArrayAttribute no se puede aplicar a una estructura de registro.
Declaración de matriz insertada
Las matrices insertadas se declaran como un tipo struct
con un único campo y un atributo que especifica la longitud de la matriz. El compilador genera los siguientes errores para las declaraciones de matriz insertadas no válidas:
- CS9167: La longitud de la matriz insertada debe ser mayor que 0.
- CS9168: La estructura de la matriz insertada no debe tener un diseño explícito.
- CS9169: La estructura de la matriz insertada debe declarar uno y solo un campo de instancia que no debe ser un campo ref.
- CS9180: El campo de elemento de matriz insertada no se puede declarar como obligatorio, de solo lectura, volátil o como un búfer de tamaño fijo.
- CS9184: No se admite la característica de lenguaje "Matrices insertadas" para los tipos de matriz insertados con campo de elemento que es un campo "
ref
" o tiene un tipo que no es válido como argumento de tipo. - CS9259: el atributo System.Runtime.CompilerServices.InlineArrayAttribute no se puede aplicar a una estructura de registro.
Para corregir estas matrices, asegúrese de que se cumple lo siguiente:
- El argumento de System.Runtime.CompilerServices.InlineArrayAttribute es un entero positivo.
- La inclusión
struct
no especifica ningún diseño explícito. - La inclusión
struct
tiene un único campo de instancia y ese campo de instancia no es un camporef
. - El campo de instancia única no es un búfer de tamaño fijo.
- El campo de instancia única no incluye los modificadores
required
,volatile
oreadonly
. - Quite el modificador de la
record
declaración de matriz insertada.
Acceso a elementos
Se accede a los elementos de una matriz insertada igual que en cualquier matriz. El compilador emite los errores siguientes a partir del acceso incorrecto a los elementos:
- CS9166: El índice está fuera de los límites de la matriz insertada
- CS9172: Solo se puede tener acceso a los elementos de un tipo de matriz insertada con un único argumento implícitamente convertible a
int
,System.Index
oSystem.Range
. - CS9173: Un acceso de matriz no puede tener un especificador de argumento con nombre
- CS9189: No se admite la instrucción
foreach
en una matriz insertada de tipo
Además, el compilador emite la siguiente advertencia al declarar un indexador:
- CS9181: El indexador de matriz insertada no se usará para la expresión de acceso a elementos.
El código generado para un búfer insertado accede directamente a la memoria del búfer y pasa los indizadores declarados. Las matrices insertadas no se pueden usar con la instrucción foreach
.
El argumento para el indexador debe ser:
- Uno de estos tres tipos:
int
,System.Index
oSystem.Range
. - No puede ser un argumento con nombre. El compilador genera el descriptor de acceso del elemento. El parámetro no tiene un nombre, por lo que no puede usar argumentos con nombre.
- Se incluye en los límites de la matriz. Al igual que todas las matrices de .NET, el acceso al elemento de matriz insertado está protegido por límites. El índice debe estar dentro de los límites de la matriz insertada.
Conversiones a intervalo
A menudo se usa System.Span<T> o System.ReadOnlySpan<T> para trabajar con matrices insertadas. El compilador genera los errores siguientes para conversiones no válidas:
- CS9164: No se puede convertir la expresión en
Span<T>
porque no es una variable asignable - CS9165: No se puede convertir la expresión en
ReadOnlySpan<T>
porque es posible que no se pase o se devuelva por referencia
El compilador genera código que accede directamente a la memoria de un búfer insertado. Por lo tanto, algunos miembros nunca son llamados. El compilador genera las siguientes advertencias si escribe uno de los miembros a los que no se llama nunca:
- CS9182: El método "Sector" de matriz insertada no se usará para la expresión de acceso a elementos.
- CS9183: El operador de conversión de matriz insertada no se usará para la conversión de la expresión del tipo declarante.
Una matriz insertada se puede convertir implícitamente en Span<T>
o en ReadOnlySpan<T>
para pasar una matriz insertada a métodos. El compilador aplica restricciones en esas conversiones:
- La matriz insertada debe ser grabable para convertir una matriz insertada en
Span<T>
. Si la matriz es de solo lectura, no se puede convertirlo en unSpan<T>
grabable. Puede usarReadOnlySpan<T>
en su lugar. - El contexto seguro de la matriz insertada debe ser al menos tan ancho como el contexto seguro de
Span<T>
oReadOnlySpan<T>
para que la conversión se realice correctamente. Debe limitar el contexto del intervalo o expandir el ámbito de la matriz insertada.
Además, el compilador nunca genera llamadas a un método Slice
en un búfer insertado. No se llama a los operadores de conversión para convertir un búfer insertado en Span
o ReadOnlySpan
. El compilador genera código para crear System.Span<T> o System.ReadOnlySpan<T> directamente desde el búfer de memoria.