Thomas Darimont
Erfahrenes Mitglied
Hallo,
... liefert nicht wie man auf den ersten Blick meinen sollte
1
1
sondern:
Ausgabe:
Um das "gewünschte" Verhalten zu bekommen muss man beim Aufruf der Process Methode für das int[] auch den generischen Typ Parameter entsprechend setzen.
also:
Das ergibt dann die "gewünschte" Ausgabe:
Hintergrund dieses Effekts ist die Generics Implementierung von .Net. Diese generiert durch den Compiler für jede Parameterisierung entsprechende Versionen der Generischen Methode. Im ersten Fall mit der <object> Ausprägung wird dann versucht ein int[] in ein object[] zu casten was nicht geht weshalb einfach ein object[] erzeugt und das int[] als erstes element in diesem objekt[] abgelegt wird. Verwendet man nun die <int> Ausprägung der generischen Methode so wird das int[] direkt als Array für params erkannt.
Gruß Tom
C#:
using System;
using System.Collections.Generic;
using System.Text;
namespace De.Tutorials.Training
{
public class GenericBoxingExample
{
public static void Main(string[] args)
{
int[] numbers = new int[] { 1,2,3};
object[] data = new object[] { 1, 2, 3 };
Console.WriteLine(Process<object>(numbers));
Console.WriteLine(Process<object>(data));
}
public static TValue Process<TValue>(params TValue[] args)
{
return args[0];
}
}
}
... liefert nicht wie man auf den ersten Blick meinen sollte
1
1
sondern:
Ausgabe:
Code:
System.Int32[]
1
Um das "gewünschte" Verhalten zu bekommen muss man beim Aufruf der Process Methode für das int[] auch den generischen Typ Parameter entsprechend setzen.
also:
C#:
Console.WriteLine(Process<int>(numbers));
Das ergibt dann die "gewünschte" Ausgabe:
Code:
1
1
Drücken Sie eine beliebige Taste . . .
Hintergrund dieses Effekts ist die Generics Implementierung von .Net. Diese generiert durch den Compiler für jede Parameterisierung entsprechende Versionen der Generischen Methode. Im ersten Fall mit der <object> Ausprägung wird dann versucht ein int[] in ein object[] zu casten was nicht geht weshalb einfach ein object[] erzeugt und das int[] als erstes element in diesem objekt[] abgelegt wird. Verwendet man nun die <int> Ausprägung der generischen Methode so wird das int[] direkt als Array für params erkannt.
Gruß Tom