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
niSystem.ParamArrayAttribute
/System.Runtime.CompilerServices.ParamCollectionAttribute
. Use la palabra claveparams
en su lugar. - CS0758: ambas declaraciones de métodos parciales deben usar un parámetro
params
; si no, ninguna podrá usar un parámetroparams
- 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
uout
- 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
uout
- 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 modificadorin
,ref readonly
,ref
oout
. - El modificador
params
no se puede combinar con el modificadorthis
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
niSystem.Runtime.CompilerServices.ParamCollectionAttribute
. Use la palabra claveparams
en su lugar. - CS0758: ambas declaraciones de métodos parciales deben usar un parámetro
params
; si no, ninguna podrá usar un parámetroparams
- 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ónparams
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ámetroparams
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.