Errori e avvisi correlati al modificatore di params
sui parametri del metodo
Esistono alcuni errori correlati all'istruzione lock
e alla sincronizzazione dei thread:
- CS0225: Il parametro params deve essere una matrice unidimensionale o avere un tipo di raccolta valido
- CS0231: Il parametro params deve essere l'ultimo in un elenco di parametri formali.
- CS0466: 'method1' non deve contenere un parametro params perché 'method2' non ne ha
- CS0674: Non usare
System.ParamArrayAttribute
oSystem.ParamArrayAttribute
/System.Runtime.CompilerServices.ParamCollectionAttribute
. Usare invece la parola chiaveparams
. - CS0758: Entrambe le dichiarazioni di metodo parziale devono usare un parametro
params
, altrimenti nessuna delle due potrà usare un parametroparams
- CS1104: Non è possibile usare una matrice di parametri con il modificatore
this
in un metodo di estensione. - CS1611: Il parametro params non può essere dichiarato come in
ref
oout
- CS1670:
params
non valido nel contesto corrente - CS1751: Impossibile specificare un valore predefinito per una matrice di parametri.
- CS9218: Gli argomenti di tipo per il metodo non possono essere dedotti dall'uso, perché viene utilizzato un argomento di tipo dinamico e il metodo dispone di un parametro di raccolta dei params non matrice. Provare a specificare gli argomenti di tipo in modo esplicito.
- CS9223: Creazione di una raccolta params genera una catena infinita di chiamate del costruttore.
- CS9224: Il metodo non può essere meno visibile del membro con raccolta params.
- CS9225: Il costruttore lascia il membro richiesto non inizializzato.
- CS9227: Il tipo non contiene una definizione per un metodo di
Add
di istanza appropriato. - CS9228: Tipo di raccolta params non matrice deve avere un costruttore applicabile che può essere chiamato senza argomenti.
Regole di dichiarazione del metodo
I seguenti errori indicano l'uso di un modificatore params
su un parametro quando il modificatore params
non è consentito in tale contesto:
- CS0231: Il parametro params deve essere l'ultimo in un elenco di parametri formali.
- CS1104: Non è possibile usare una matrice di parametri con il modificatore
this
in un metodo di estensione. - CS1611: Il parametro params non può essere dichiarato come in
ref
oout
- CS1670:
params
non valido nel contesto corrente - CS1751: Impossibile specificare un valore predefinito per una matrice di parametri.
Il compilatore applica le regole seguenti all'uso del modificatore params
su un parametro del metodo:
- Il modificatore
params
è consentito solo sull'ultimo parametro in un elenco di parametri formali. Sono inclusi tutti i parametri con un valore predefinito. - Non è possibile includere un argomento predefinito per il parametro quando viene usato il modificatore
params
. - Il modificatore
params
non può essere applicato al parametro per riferimento. Un parametro di riferimento è uno con il modificatorein
,ref readonly
,ref
oout
. - Il modificatore
params
non può essere combinato con il modificatorethis
in un metodo di estensione. - Il modificatore
params
non può essere usato in un operatore di overload.
Nelle versioni precedenti a C# 12, il modificatore params
non può essere usato nel parametro di un metodo anonimo o di un'espressione lambda.
Regole del tipo di parametro e di argomento
Gli errori seguenti indicano che il tipo del parametro usato con params
non è valido:
- CS9218: Gli argomenti di tipo per il metodo non possono essere dedotti dall'uso, perché viene utilizzato un argomento di tipo dinamico e il metodo dispone di un parametro di raccolta dei params non matrice. Provare a specificare gli argomenti di tipo in modo esplicito.
- CS0225: Il parametro params deve essere una matrice unidimensionale o avere un tipo di raccolta valido
- CS9227: Il tipo non contiene una definizione per un metodo di
Add
di istanza appropriato. - CS9228: Tipo di raccolta params non matrice deve avere un costruttore applicabile che può essere chiamato senza argomenti.
Nelle versioni precedenti a C# 13, il modificatore params
è consentito solo in matrici unidimensionali. Nessun altro tipo era valido.
A partire da C# 13 è possibile usare qualsiasi tipo di raccolta valido. Tuttavia, rimangono alcune restrizioni. Il tipo di raccolta deve seguire le stesse regole della destinazione di un'espressione di raccolta.
Altri errori di parametri
Gli errori seguenti indicano altri problemi relativi all'uso del modificatore params
:
- CS0466: 'method1' non deve contenere un parametro params perché 'method2' non ne ha
- CS0674: Non usare
System.ParamArrayAttribute
oSystem.Runtime.CompilerServices.ParamCollectionAttribute
. Usare invece la parola chiaveparams
. - CS0758: Entrambe le dichiarazioni di metodo parziale devono usare un parametro
params
, altrimenti nessuna delle due potrà usare unparams
parametro - CS9223: Creazione di una raccolta params genera una catena infinita di chiamate del costruttore.
- CS9224: Il metodo non può essere meno visibile del membro con raccolta params.
- CS9225: Il costruttore lascia il membro richiesto non inizializzato.
Un metodo che implementa un'interfaccia deve includere il modificatore params
se e solo se il membro dell'interfaccia dispone del modificatore params
. Analogamente, entrambe le dichiarazioni di un metodo partial
devono includere il modificatore params
oppure nessuno può includere il modificatore params
.
È necessario usare il modificatore params
. Non è possibile applicare gli attributi equivalenti System.ParamArrayAttribute o System.Runtime.CompilerServices.ParamCollectionAttribute.
Il compilatore genera uno dei tre errori finali nell'elenco precedente quando il codice generato per creare il tipo di raccolta non è valido:
- Il compilatore genera CS9223 quando il codice generato per creare la raccolta contiene anche una raccolta params dello stesso tipo. In genere, il metodo
Add
accetta una raccoltaparams
dello stesso tipo. - Il compilatore genera CS9224 quando il metodo
Create
per il tipo di raccolta è meno accessibile del metodo che accetta il parametroparams
del tipo di raccolta. - Il compilatore genera CS9225 quando il tipo di raccolta ha un membro obbligatorio e il costruttore senza parametri non inizializza tale membro e ha il System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute nel costruttore senza parametri.