Ich arbeite an einem kleinen Projekt mit ein paar verschiedenen Arten von Arrays (zB double[]
, float[]
, int[]
). Für die Verifizierung/Test/Vernunft, Drucke ich einige dieser Arrays auf der Konsole, wie ich mitfahre. Also habe ich mehrere Funktionen haben, die unten wie diese aussehen (für dieses Beispiel vereinfacht - davon ausgehen, ich bin nur mit Single-Dimension-Arrays zu tun):Warum kann System.Array keine Typbeschränkung sein?
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]);
}
}
ich in meiner unendlichen Weisheit, dachte ich einige der verringern könnte Code-Duplizierung durch einfaches Erstellen einer generischen Version dieser Funktionen.So habe ich es versucht:
void Print<T>(T t) where T : Array
{
for (int i = 0; i < t.Length; i++)
{
Console.Write(t.GetValue(i));
}
}
Intellisense ist nicht beschweren, aber der Compiler nicht mit einem sehr interessanten Fehler:
Constraint cannot be special class 'System.Array'
Ich habe nach einer Erklärung (ähnlich Object
oder versiegelte Klassen sieht, habe aber nicht viel gefunden, nicht nur ein Erwähnen Sie on msdn. Kann mir jemand erklären warum das ist der Fall? Warum kann ich keine Typbeschränkung von System.Array
angeben?
ps: Während dies aus der Eingabe, erkannte ich, dass ich erreichen kann, was ich wollte, leichter, ursprünglich mit einer einfachen Funktion wie folgt aus:
void Print(System.Array a)
{
for (int i = 0; i < a.Length; i++)
{
Console.Write(a.GetValue(i));
}
}
Aus diesem Grund für Arrays in den Compiler eine spezielle Regel gibt es ?
Macht Sinn, aber ich bin immer noch neugierig _why_ Ich kann nicht eine Basisklasse Typ Einschränkung von 'Array' ... – vlad
Auch aus Neugier, ist das anders als die Verwendung eines Parameters des Typs' Array'? Gibt es etwas Boxen, wenn ich 'Array' benutze? – vlad
@vlad Da es sich bei Arrays um Referenztypen und nicht um Werttypen handelt, gibt es kein Boxing, obwohl Sie die Objekte, die Sie daraus erhalten, im Gegensatz zu einem typisierten Array einbetten. Es ist auch nicht dasselbe, da ein 'Array' auch ein 2, 3 oder N-dimensionales Array oder ein Array sein kann, das nicht 0-indexiert ist. – Servy