Sto lavorando a un piccolo progetto con alcuni tipi diversi di array (ad esempio double[]
, float[]
, int[]
. Per scopi di verifica/test/sanità mentale, sto stampando alcuni di questi array sulla console mentre procedo. così ho molteplici funzioni che assomigliano a questi di seguito (semplificata per questo esempio - assumere sono solo trattare con gli array monodimensionali):Perché System.Array non può essere un vincolo di tipo?
void Print(float[] a) // prints an array of floats
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a[i]);
}
}
void Print(double[] a) // prints an array of doubles
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a[i]);
}
}
io, nella mia infinita saggezza, pensavo di poter ridurre alcuni dei duplicazione del codice semplicemente creando una versione generica di queste funzioni. Così ho provato questo:
void Print<T>(T t) where T : Array
{
for (int i = 0; i < t.Length; i++)
{
Console.Write(t.GetValue(i));
}
}
Intellisense non si lamenta, ma il compilatore non riesce con un errore molto interessante:
Constraint cannot be special class 'System.Array'
Ho cercato una spiegazione (simile a Object
o classi sigillato, ma non ho trovato molto, oltre ad una menzionare on msdn. Qualcuno mi può spiegare perché questo è il caso? Perché non è possibile specificare un vincolo di tipo System.Array
?
ps: Durante la digitazione questo fuori, mi sono reso conto che posso realizzare quello che in origine volevo più facilmente, con una semplice funzione come questa:
void Print(System.Array a)
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a.GetValue(i));
}
}
È questo il motivo per cui c'è una regola speciale per le matrici nel compilatore ?
ha un senso, ma io sono ancora curioso _perché_ non posso avere un tipo di vincolo classe base di 'Array' ... – vlad
Inoltre, per curiosità, è molto diverso da utilizzando un parametro di tipo' Array'? C'è un po 'di boxe in corso se uso 'Array'? – vlad
@vlad Non c'è boxe dato che le matrici sono tipi di riferimento, non tipi di valore, anche se stai inscatolando gli oggetti che ne hai ricavato, diversamente da un array tipizzato. Non è nemmeno la stessa poiché un 'array' potrebbe anche essere un array di dimensioni 2, 3 o N, o un array che non è indicizzato a 0. – Servy