Vorsicht bei generischen Methoden, Boxing und params

Thomas Darimont

Erfahrenes Mitglied
Hallo,

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
 
Zurück