Compartir vía


Errores y advertencias relacionados con el modificador params en los parámetros del método

Hay algunos errores relacionados con la instrucción lock y la sincronización de subprocesos:

  • CS0225: el parámetro params debe ser una matriz unidimensional o tener un tipo de colección válido
  • CS0231: un parámetro params debe ser el último parámetro de una lista de parámetros formales.
  • CS0466: 'method1' no debe tener un parámetro params porque 'method2' tampoco lo tiene
  • CS0674: No use System.ParamArrayAttribute ni System.ParamArrayAttribute/System.Runtime.CompilerServices.ParamCollectionAttribute. Use la palabra clave params en su lugar.
  • CS0758: ambas declaraciones de métodos parciales deben usar un parámetro params; si no, ninguna podrá usar un parámetro params
  • CS1104: una matriz de parámetros no se puede usar con el modificador this en un método de extensión.
  • CS1611: el parámetro params no se puede declarar como en ref u out
  • CS1670: params no es válido en este contexto
  • CS1751: no se puede especificar un valor predeterminado de una matriz de parámetros.
  • CS9218: los argumentos de tipo para el método no se pueden deducir del uso porque se usa un argumento con tipo dinámico y el método tiene un parámetro de colección params que no es de matriz. Pruebe a especificar los argumentos de tipo explícitamente.
  • CS9223: la creación de una colección de parámetros da como resultado una cadena infinita de invocación del constructor.
  • CS9224: el método no puede ser menos visible que el miembro con la colección params.
  • CS9225: el constructor deja el miembro necesario sin inicializar.
  • CS9227: el tipo no contiene una definición para un método de instancia Add adecuado.
  • CS9228: el tipo de colección params que no es de matriz debe tener un constructor aplicable al que se pueda llamar sin argumentos.

Reglas de declaración de método

Los errores siguientes indican el uso de un modificador params en un parámetro cuando no se permite el modificador params en ese contexto:

  • CS0231: un parámetro params debe ser el último parámetro de una lista de parámetros formales.
  • CS1104: una matriz de parámetros no se puede usar con el modificador this en un método de extensión.
  • CS1611: el parámetro params no se puede declarar como en ref u out
  • CS1670: params no es válido en este contexto
  • CS1751: no se puede especificar un valor predeterminado de una matriz de parámetros.

El compilador aplica las siguientes reglas sobre el uso del modificador params en un parámetro de método:

  • El modificador params solo se permite en el último parámetro de una lista de parámetros formal. Esto incluye cualquier parámetro con un valor predeterminado.
  • No se puede incluir un argumento predeterminado para el parámetro cuando se usa el modificador params.
  • El modificador params no se puede aplicar al parámetro de referencia. Un parámetro de referencia es uno con el modificador in, ref readonly, ref o out.
  • El modificador params no se puede combinar con el modificador this en un método de extensión.
  • El modificador params no se puede usar en un operador sobrecargado.

En versiones anteriores a C# 12, el modificador params no se puede usar en el parámetro de un método anónimo o una expresión lambda.

Reglas de tipo de parámetro y argumento

Los errores siguientes indican que el tipo del parámetro usado con params no es válido:

  • CS9218: los argumentos de tipo para el método no se pueden deducir del uso porque se usa un argumento con tipo dinámico y el método tiene un parámetro de colección params que no es de matriz. Pruebe a especificar los argumentos de tipo explícitamente.
  • CS0225: el parámetro params debe ser una matriz unidimensional o tener un tipo de colección válido
  • CS9227: el tipo no contiene una definición para un método de instancia Add adecuado.
  • CS9228: el tipo de colección params que no es de matriz debe tener un constructor aplicable al que se pueda llamar sin argumentos.

En versiones anteriores a C# 13, solo se permite el modificador params en matrices unidimensionales. Ningún otro tipo era válido.

A partir de C# 13, se puede usar cualquier tipo de colección válido. Sin embargo, siguen existiendo algunas restricciones. El tipo de colección debe seguir las mismas reglas que el destino de una expresión de colección.

Otros errores de parámetros

Los errores siguientes indican otros problemas al usar el modificador params:

  • CS0466: 'method1' no debe tener un parámetro params porque 'method2' tampoco lo tiene
  • CS0674: No use System.ParamArrayAttribute ni System.Runtime.CompilerServices.ParamCollectionAttribute. Use la palabra clave params en su lugar.
  • CS0758: ambas declaraciones de métodos parciales deben usar un parámetro params; si no, ninguna podrá usar un parámetro params
  • CS9223: la creación de una colección de parámetros da como resultado una cadena infinita de invocación del constructor.
  • CS9224: el método no puede ser menos visible que el miembro con la colección params.
  • CS9225: el constructor deja el miembro necesario sin inicializar.

Un método que implementa una interfaz debe incluir el modificador params si y solo si el miembro de interfaz tiene el modificador params. Del mismo modo, ambas declaraciones de un método partial deben incluir el modificador params o ninguno puede incluir el modificador params.

Debe usar el modificador params. No se pueden aplicar los atributos equivalentes, ya sea System.ParamArrayAttribute o System.Runtime.CompilerServices.ParamCollectionAttribute.

El compilador genera uno de los tres errores finales de la lista anterior cuando el código generado para crear el tipo de colección no es válido:

  • El compilador emite CS9223 cuando el código emitido para crear la colección también contiene una colección params del mismo tipo. Normalmente, el método Add toma una colección params del mismo tipo.
  • El compilador emite CS9224 cuando el método Create para el tipo de colección es menos accesible que el método que toma el parámetro params del tipo de colección.
  • El compilador emite CS9225 cuando el tipo de colección tiene un miembro necesario y el constructor sin parámetros no inicializa ese miembro y tiene System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute en el constructor sin parámetros.

Consulte también