Resolver errores y advertencias en declaraciones de matriz y colección y expresiones de inicialización

En este artículo se tratan los siguientes errores del compilador:

  • CS0022: Número incorrecto de índices dentro de [], se esperaba "número".
  • CS0178: Especificador de rango no válido: se esperaba ”,” o ”].
  • CS0248: No se puede crear una matriz con un tamaño negativo
  • CS0270: El tamaño de la matriz no se puede especificar en una declaración de variable (intente inicializar con una expresión ”new”).
  • CS0611: Los elementos de matriz no pueden ser del tipo.
  • CS0623: Los inicializadores de matriz solo se pueden utilizar en un inicializador de campo o variable. Pruebe a utilizar una expresión new en su lugar.
  • CS0650: Declarador de matriz erróneo. Para declarar una matriz administrada, el especificador de rango precede al identificador de la variable. Para declarar un campo de búfer de tamaño fijo, utilice la palabra clave fija antes del tipo de campo.
  • CS0719: Los elementos de matriz no pueden ser de tipo estático.
  • CS0747: Declarador de miembro de inicializador no válido.
  • CS0820: No se puede asignar un inicializador de matriz a una variable local con tipo implícito.
  • CS0826: No se encontró el mejor tipo para la matriz con tipo implícito.
  • CS0846: Se espera un inicializador de matriz anidada.
  • CS1552: El especificador de tipo de matriz, [], debe aparecer antes del nombre del parámetro.
  • CS1586: La creación de matriz debe disponer de un tamaño de matriz o un inicializador de matriz.
  • CS1920: El inicializador de elemento no puede estar vacío.
  • CS1921: La mejor coincidencia de método sobrecargado tiene una firma errónea para el elemento inicializador. El elemento Add inicializable debe ser un método de instancia accesible.
  • CS1925: No se puede inicializar el objeto de tipo "tipo" con un inicializador de colección..
  • CS1954: La mejor correspondencia del método sobrecargado para el elemento inicializador de la colección no se puede usar. Los métodos "Add" del inicializador de la colección no pueden tener parámetros ref o out.
  • CS9174No se puede inicializar el tipo con un literal de colección porque el tipo no se puede construir.
  • CS9176No hay ningún tipo de destino para el literal de colección.
  • CS9185: El tipo de generador CollectionBuilderAttribute debe ser una clase o estructura no genérica.
  • CS9186: El nombre del método CollectionBuilderAttribute no es válido.
  • CS9187: No se pudo encontrar un método accesible con la firma esperada: un método estático con un único parámetro de tipo ReadOnlySpan<T>; y el tipo de valor devuelto correcto.
  • CS9188: El tipo tiene un collectionBuilderAttribute, pero ningún tipo de elemento.
  • CS9203: No se puede usar una expresión de colección de este tipo en este contexto porque puede exponerse fuera del ámbito actual.
  • CS9210: Esta versión de System.Collections.Immutable.ImmutableArray<T>no se puede usar con expresiones de colección.

Además, en este artículo se tratan las siguientes advertencias:

  • CS3007: El método sobrecargado "método" que sólo se diferencia por tipos de matriz sin nombre no es conforme a CLS.
  • CS3016: El uso de matrices como argumentos de atributo no es conforme a CLS.
  • CS0251: Indizando una matriz con un índice negativo (los índices de matriz siempre comienzan por cero).
  • CS9208: La expresión de colección puede incurrir en asignaciones inesperadas del montón. Considere la posibilidad de crear explícitamente una matriz y, a continuación, convertir al tipo final para que la asignación sea explícita.
  • CS9209: La expresión de colección puede incurrir en asignaciones inesperadas del montón debido al uso de propagaciones "..". Considere la posibilidad de crear explícitamente una matriz y, a continuación, convertir al tipo final para que la asignación sea explícita.

Puede obtener más información sobre matrices, inicializadores de colección y expresiones de colección en los siguientes artículos:

Inicializador de colección no válido

Los errores siguientes indican que el código generado por el compilador para un inicializador de colección no es válido.

  • CS0747: Declarador de miembro de inicializador no válido.
  • CS1920: El inicializador de elemento no puede estar vacío..
  • CS1921La mejor coincidencia de método sobrecargado tiene una firma errónea para el elemento inicializador. El elemento Add inicializable debe ser un método de instancia accesible.
  • CS1954La mejor correspondencia del método sobrecargado para el elemento inicializador de la colección no se puede usar. Los métodos "Add" del inicializador de la colección no pueden tener parámetros ref o out.
  • CS9174No se puede inicializar el tipo con un literal de colección porque el tipo no se puede construir.
  • CS9176: No hay ningún tipo de destino para el literal de colección.
  • CS9203: No se puede usar una expresión de colección de este tipo en este contexto porque puede exponerse fuera del ámbito actual.
  • CS9210: Esta versión de System.Collections.Immutable.ImmutableArray<T>no se puede usar con expresiones de colección.

El compilador también puede generar la advertencia siguiente:

  • CS9208: La expresión de colección puede incurrir en asignaciones inesperadas del montón. Considere la posibilidad de crear explícitamente una matriz y, a continuación, convertir al tipo final para que la asignación sea explícita.
  • CS9209: La expresión de colección puede incurrir en asignaciones inesperadas del montón debido al uso de propagaciones "..". Considere la posibilidad de crear explícitamente una matriz y, a continuación, convertir al tipo final para que la asignación sea explícita.

Estos errores indican que el código generado por el compilador para un inicializador de colección no es válido. Compruebe lo siguiente:

  • Un inicializador de colección contiene una secuencia de elementos. No se pueden combinar propiedades de configuración en la instancia de colección con la adición de elementos en el mismo inicializador.
  • Un inicializador de colección que incluye llaves ({ y }) no puede estar vacío.
  • Un método Add conforme debe ser accesible y tomar un parámetro del mismo tipo que los elementos de la colección. El parámetro no puede incluir el modificador ref o out.
  • La resolución de sobrecarga debe elegir un método Add como mejor coincidencia. No puede haber varios métodos coincidentes que sean igualmente buenos.
  • Las expresiones de colección pueden inicializar variables de tipo explícito de un tipo de colección. Si la variable no es un tipo de colección o matriz, o se escribe implícitamente (mediante var), no se puede usar un inicializador de colección.
  • Un tipo ref struct, como System.Span<T> no se puede inicializar con una expresión de colección que pueda infringir la seguridad de referencias.
  • Una expresión de colección no puede inicializar correctamente un System.Collections.Immutable.ImmutableArray<T> mediante la versión actual. Use una versión diferente del entorno de ejecución o cambie la expresión de inicialización.

Las advertencias indican que la expresión de colección, incluidos los elementos de propagación, pueden asignar memoria. La creación de almacenamiento y conversión diferentes podría ser más eficaz.

Inicializador de matriz no válido

  • CS0623: Los inicializadores de matriz solo se pueden utilizar en un inicializador de campo o variable. Pruebe a utilizar una expresión new en su lugar.
  • CS0846Se espera un inicializador de matriz anidada.
  • CS1925: No se puede inicializar el objeto de tipo 'tipo' con un inicializador de colección.

Estos errores indican que ha creado un inicializador no válido. La causa probable es llaves desequilibradas { y } alrededor de uno o varios elementos o matrices secundarias. Asegúrese de que la expresión de inicialización coincide con el número de matrices de una inicialización de matriz escalonada y de que las llaves están equilibradas.

Acceso a elementos de matriz no válidos

  • CS0022: Número incorrecto de índices dentro de [], se esperaba "número".
  • CS0251: Indexación de una matriz con un índice negativo (los índices de matriz siempre comienzan por cero).

Para acceder a un elemento de una matriz, especifique el índice de cada eje declarado en la matriz. Los índices están entre [ y ] después del nombre de la matriz. Hay dos reglas para los índices de matriz:

  1. Debe especificar el mismo número de índices que se usan en la declaración de matriz. Si la matriz tiene una dimensión, debe especificar un índice. Si la matriz tiene tres dimensiones, debe especificar tres índices.
  2. Todos los índices deben ser enteros no negativos.

Clasificación de matriz no válida

  • CS0178: Especificador de rango no válido: se esperaba "," o "]".
  • CS0650: Declarador de matriz erróneo. Para declarar una matriz administrada, el especificador de rango precede al identificador de la variable. Para declarar un campo de búfer de tamaño fijo, utilice la palabra clave fija antes del tipo de campo.
  • CS1552: El especificador de tipo de matriz, [], debe aparecer antes del nombre del parámetro.

Una declaración de matriz consta de los siguientes tokens, en orden:

  1. El tipo de los elementos de la matriz. Por ejemplo, int, string o SomeClassType.
  2. Los corchetes de matriz, opcionalmente, incluyen comas para representar varias dimensiones.
  3. El nombre de la variable.

Cuando una inicialización de matriz especifica las dimensiones de la matriz, puede especificar las siguientes propiedades:

  • Número de elementos entre llaves ({ y })
  • Corchetes sin contenido
  • Una o varias comas entre corchetes

Por ejemplo, las siguientes son declaraciones de matriz válidas:

int[] anArrayOfIntegers;
string[,,] threeDimensionalStringArray;

Para obtener más información, consulte la sección especificación de C# (especificación del lenguaje C#) sobre inicializadores de matriz.

Longitud de matriz no válida

  • CS0248: No se puede crear una matriz con un tamaño negativo.
  • CS0270: El tamaño de la matriz no se puede especificar en una declaración de variable (intente inicializar con una expresión "nueva").
  • CS1586: La creación de matriz debe disponer de un tamaño de matriz o un inicializador de matriz.

La longitud de cada dimensión de una matriz debe especificarse como parte de la inicialización de la matriz, no como su declaración. La longitud de cada dimensión debe ser positiva. Puede especificar la longitud mediante una expresión new para asignar la matriz o mediante un inicializador de matriz para asignar todos los elementos. En el ejemplo siguiente se muestran ambos mecanismos:

int[] fiveIntegers = new int[5];
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

Tipo de elemento no válido

  • CS0611: Los elementos de matriz no pueden ser del tipo "type".
  • CS0719: Los elementos de matriz no pueden ser de tipo estático.
  • CS0820: No se puede asignar un inicializador de matriz a una variable local con tipo implícito.
  • CS0826: No se encontró el mejor tipo para la matriz con tipo implícito.

Existen algunos tipos que no pueden usarse como el tipo de una matriz. Estos tipos incluyen System.TypedReference y System.ArgIterator. El tipo de una matriz no puede ser una clase static, ya que no se pueden crear instancias de una clase static.

Puede declarar matrices como variables locales con tipo implícito. La matriz debe inicializarse mediante una expresión new. Además, todos los elementos de un inicializador de matriz deben tener un mejor tipo común. En los ejemplos siguientes se muestra cómo declarar una matriz con tipo implícito:

var implicitType = new[] { 1, 2, 3 };
        
char c = 'c';
short s1 = 0;
short s2 = -0;
short s3 = 1;
short s4 = -1;

// common type is "int"
var commonType = new[] { s1, s2, s3, s4, c, 1 };

Puede asegurarse del mejor tipo común mediante cualquiera de las técnicas siguientes:

  • Proporcione un tipo explícito a la matriz.
  • Proporcione el mismo tipo a todos los elementos de matriz.
  • Proporcione conversiones explícitas en esos elementos que pueden estar provocando el problema.

Generador de colecciones no válido

Los errores siguientes indican errores en el tipo de generador de colecciones:

  • CS9185: El tipo de generador CollectionBuilderAttribute debe ser una clase o estructura no genérica.
  • CS9186: El CollectionBuilderAttribute método no es válido.
  • CS9187: No se pudo encontrar un método accesible con la firma esperada: un método estático con un único parámetro de tipo ReadOnlySpan<T>; y el tipo de valor devuelto correcto.
  • CS9188: El tipo tiene un CollectionBuilderAttribute pero ningún tipo de elemento.

Estos errores indican que el tipo de generador de colecciones necesita modificaciones. Recuerde las siguientes reglas:

  • El tipo de colección debe tener un tipo de iteración. En otras palabras, puede hacer un foreach del tipo como una colección.
  • El tipo de generador de colecciones no puede ser un tipo genérico.
  • El nombre del método especificado en System.Runtime.CompilerServices.CollectionBuilderAttribute debe ser un nombre de método válido. Por ejemplo, no puede ser finalizador u otro nombre que contenga caracteres de identificador no válidos.
  • El método del generador de colecciones debe ser un método estático accesible. Debe devolver el tipo de colección y debe tomar un parámetro de ReadOnlySpan<T> donde T coincide con el tipo de elemento de la colección.

Advertencias de especificación de lenguaje común

  • CS3007: El método sobrecargado "método" que sólo se diferencia por tipos de matriz sin nombre no es conforme a CLS.
  • CS3016: El uso de matrices como argumentos de atributo no es conforme a CLS.

CS3007 ocurre si tiene un método sobrecargado que toma una matriz irregular y la única diferencia entre las firmas del método es el tipo de elemento de la matriz. Para evitar este error, considere usar una matriz rectangular en lugar de una matriz irregular o, si no es necesario el cumplimiento de CLS, elimine el atributo CLSCompliantAttribute. Para obtener más información sobre la conformidad con CLS, vea Independencia del lenguaje y componentes independientes del lenguaje.

CS3016 indica que no cumple con la Common Language Specification (CLS) para pasar una matriz a un atributo. Para obtener más información sobre la conformidad con CLS, consulte Independencia del lenguaje y componentes independientes del lenguaje.