Freitag, Februar 28, 2020

Nicht zu verstehen Geben.IsAssignableFrom

int i=1;
long longOne=i; //assignment works fine
//...but
bool canAssign=(typeof(long).IsAssignableFrom(typeof(int))); //false

Warum ist canAssign falsch?

InformationsquelleAutor spender | 2011-01-24

5 Kommentare

  1. 11

    Beim zuweisen int zu einem long alle passiert ist, dass eine implizite Konvertierung. longOne ist eine tatsächliche long (als ob Sie initialisiert es 1L), und nicht ein int getarnt als eine long, wenn Sie bekommen die drift.

    Dass int (oder Int32) und long (oder Int64) sind nicht verwandt in Bezug auf die Vererbung oder Implementierung; Sie passieren einfach konvertierbar sein, weil beide Integrale Anzahl Arten.

  2. 20

    Blick auf die Methode, die in den Reflektor scheint es, dass diese Methode sollte verwendet werden, für die Bestimmung, Vererbung eher als Kompatibilität.

    Wenn Sie zum Beispiel eine Klasse, die eine Schnittstelle implementiert, dann wäre die Methode gibt true zurück, wenn Sie haben
    (typeof(interface).IsAssignableFrom(typeof(class))

  3. 3

    Den IsAssignableFrom gibt true zurück, wenn die Typen identisch sind, oder wenn der Typ implementiert oder erbt es.

    Einen long Erben nicht int, so gibt die Methode false zurück.

    Beim zuweisen int Wert auf eine long, es ist nicht nur eine Zuweisung. Der compiler fügt automatisch den notwendigen code zu konvertieren, die int Wert in eine long Wert.

  4. 3

    Weil Typ.IsAssignableFrom ist .NET framework-Anlage, bei der Zuweisung von int auf long ist ein C# – Sprache ein. Wenn Sie einen Blick auf die generierte IL du wirst sehen, Typ-Konvertierung Anweisung gibt. Es gibt viele Orte, wo die CLR-Regeln könnten sich von C# lieben, ein weiteres Beispiel ist überlast-Auflösung in MethodBase.Aufrufen und durchgeführt, die von der C# – compiler.

  5. 2

    Vom http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx:

    true, wenn c und der aktuelle Type stellen den gleichen Typ, oder wenn der aktuelle Typ in der Vererbungshierarchie von c, oder wenn der aktuelle Type ist ein interface, c umsetzt, oder wenn c ist ein generischer Typ-parameter und der aktuelle Typ stellt eine der Einschränkungen von c. false, wenn keine dieser Bedingungen wahr sind, oder wenn c null ist.

    Als @BoltClock sagt, es ist nur eine implizite Konvertierung.

    • Das man immer verwirrt mich. Ich vergesse immer, die Möglichkeit zu prüfen, (Basis zum Kind oder Kind auf base). Verlassen Sie diese hier: var isSameOrChild = baseType.IsAssignableFrom(otherType)

Kostenlose Online-Tests