dedlfix: Typumwandlung

Beitrag lesen

Tach!

Leider habe ich nichts verstanden. Ein Stellvertreter für T in IEnumerable<T>?

Das T ist der Stellvertreter, der in der generischen Klasse für den Typ steht, der am Ende verwendet wird.

Das ist ja an dieser Stelle mein Problem. Wie geht das? Man kann nicht einfach IEnumerable<T> als Datentyp hinschreiben.

Doch, das kannst du. Das T muss aber in der Klasse oder zumindest in der Methode nochmal auftauchen.

public class Foo<T> {
  public void Func() {
    IEnumerable<T> bar;
  }
}

public class Foo {
  public void Func<T>() {
    IEnumerable<T> bar;
  }
}

Im ersten Beispiel weiß die Klasse, dass sie generisch ist, im zweiten ist es nur die Methode.

Bei der Verwendung gibst du dann an, was T konkret sein soll, also

Foo foo = new Foo<DateTime>(); // erstes Beispiel

oder

Foo foo = new Foo(); // zweites Beispiel
foo.Func<DateTime>();

Manchmal kann man das <DateTime> bei Methodenaufrufen weglassen, wenn der Compiler aus dem übergebenen Argumenten den Typ entnehmen kann.

Foo foo = new Foo(); // zweites Beispiel
DateTime date;
foo.Func(date);

Wenn allerdings weder die Klasse noch die Methode ein <T> haben, kannst du kein T verwenden, sondern musst einen konkreten Typ angeben. Zur Not object und dann casten.

Das "var" wird nicht aus Faulheit hingeschrieben, sondern wird dies auch von Resharper empfohlen. An dieser Stelle geht es auch nicht darum. Vielleicht bin tatsächlich etwas faul. Das wusste ich auch nicht, dass man soviel mit der Maus machen kann????!!!!! Staunlich!

Der Resharper kann das var in beide Richtungen umwandeln. Ich finde, es macht den Code schwerer lesbar. Deswegen geh ich immer die Richtung zum Expliziten. Aber jetzt wo du es sagst, erinnere ich mich, dass er das am Anfang auch so empfahl, und ich ihn alsbald umkonfigurierte.

dedlfix.