Sono consapevole che un modificatore params
(che trasforma un parametro del tipo di matrice in un cosiddetto "array di parametri") non fa specificamente parte della firma del metodo. Consideriamo ora questo esempio:Modifica del modificatore param in un metodo prioritario
class Giraffid
{
public virtual void Eat(int[] leaves)
{
Console.WriteLine("G");
}
}
class Okapi : Giraffid
{
public override void Eat(params int[] leaves)
{
Console.WriteLine("O");
}
}
Questo compila senza avvisi. Quindi:
var okapi = new Okapi();
okapi.Eat(2, 4, 6); // will not compile!
restituisce un errore (No overload for method 'Eat' takes 3 arguments
).
Ora, so che il compilatore traduce il modificatore params
in un'applicazione del System.ParamArrayAttribute
sul parametro in questione. In generale non c'è alcun problema nell'applicare una serie di attributi a un parametro di un metodo virtuale e quindi decorare il parametro "corrispondente" in un metodo di sovrascrittura in una classe derivata con un diverso insieme di attributi.
Eppure il compilatore sceglie di ignorare la mia parola chiave params
in silenzio. Al contrario, se si effettua il contrario e si applica params
al parametro nella classe base Giraffid
e quindi si omette la parola chiave nell'override in Okapi
, il compilatore sceglie di decorare entrambi i metodi con System.ParamArrayAttribute
. Ho verificato queste cose con IL DASM, ovviamente.
La mia domanda:
È questo il comportamento documentato? Ho cercato accuratamente attraverso la specifica del linguaggio C# senza trovare alcuna menzione di questo.
Posso dire che almeno l'ambiente di sviluppo di Visual Studio è confuso su questo. Quando si digita il 2, 4, 6
nella chiamata di metodo precedente, lo intellisense mi mostra void Okapi.Eat(params int[] leaves)
in un suggerimento.
Per confronto, ho anche provato attuazione di un metodo di interfaccia e cambiando la presenza/assenza di params
nell'interfaccia e nell'attuazione classe, e ho provato definente un tipo delegato e cambiando params
o non sia la definizione tipo delegato o il metodo il cui gruppo di metodi I ha assegnato a una variabile del mio tipo delegato. In questi casi era perfettamente possibile cambiare params
-ness.
Si noti che questo risponde anche perché funziona con solo interfacce (codice di esempio in duplicato in http://stackoverflow.com/questions/27843804/compiling-generic-interface-vs-generic-abstract-class-params-keyword) - non c'è "override", quindi il metodo con 'params' * non è escluso * dalla lista delle possibili corrispondenze. –