In Reflexion die unkonstruierten gattungs sagen C<>
mit dem Instanztyp C<T>
verschmelzt wird.
Dies ist vielleicht weniger als theoretisch rein; Ich denke an diese als sehr unterschiedliche Entitäten. Ich denke an eine als Symbol "C mit einem Typ Parameter" und die andere als Kompilierzeit TypC<T>
. In Code sind C<>
und C<T>
nicht Synonyme für einander; Sie können ein Feld des letzteren Typs erstellen, wenn T im Gültigkeitsbereich ist, aber Sie können niemals ein Feld des vorherigen Typs erstellen.
Dass die Reflektionsbibliothek Ihnen den Typ des Instanztyps gibt, wenn Sie nach dem unkonstruierten Typ fragen, ist jedoch nicht alles schlecht. Was würden Sie mit dem unkonstruierten Typ tun? Es gibt nichts, was du wirklich damit tun kannst. Aber mit dem Instanztyp können Sie hier "substitute int for T" sagen.
Der echte Vorteil des Erhaltens C<T>
, wenn Sie nach typeof(C<>)
fragen, ist, dass dies Ihnen immer den unkonstruierten Typ gibt. Vergleichen:
class C<T>
{
public static Type CT() { return typeof(C<T>); }
public static Type JustC() { return typeof(C<>); }
}
Wenn Sie anrufen CT, was werden Sie es auf anrufen? Es gibt keinen Typ C<T>
, um CT anzurufen. Sie können C<int>.CT
anrufen. In diesem Fall erhalten Sie C<int>
, nicht C<T>
. Der einzige Weg, um den Typ C<>
mit T konstruiert zu bekommen, ist typeof(C<>)
zu fragen.
Macht das Sinn?
Ich habe noch nicht abgedeckt Reflexion (Ich habe eine vage Vorstellung davon, was es ist)
Reflexion ist einfach die Bibliothek von Code, den Sie Informationen über Ihren Code im Code erhalten kann selbst . "typeof" gibt Ihnen ein Type-Objekt, über das Sie "nachdenken" können, um Informationen über den Typ zu erhalten.
Ich bin mir nicht sicher, ob ich verstehe, was du meinst durch „auch wenn T in ihrem Umfang nicht ist“
Die Art, wie ich sagte, es ist verwirrend. Ich habe es umformuliert.
sehr gute Frage +1 – nawfal