Kein Verständnis von Type.IsAssignableFrom

7
%Vor%

Warum ist canAssign falsch?

    
spender 24.01.2011, 11:09
quelle

5 Antworten

10

Wenn Sie einem int ein long zuweisen, passiert nur eine implizite Konvertierung. longOne ist ein tatsächliches long (als ob du es initialisiert hättest als 1L ), und nicht ein int maskiert als long , wenn du die Drift bekommst.

Das heißt, int (oder Int32 ) und long (oder Int64 ) sind nicht in Bezug auf Vererbung oder Implementierung verwandt; Sie sind zufällig konvertierbar, weil beide ganzzahlige Zahlen sind.

    
BoltClock 24.01.2011, 11:13
quelle
13

Wenn man sich die Methode in Reflector anschaut, sieht es so aus, als ob diese Methode für die Bestimmung der Vererbung und nicht für die Kompatibilität verwendet werden sollte.

Wenn Sie zum Beispiel eine Klasse haben, die eine Schnittstelle implementiert, dann würde die Methode true zurückgeben, wenn Sie dies getan hätten (typeof(interface).IsAssignableFrom(typeof(class))

    
Matthew Steeples 24.01.2011 11:15
quelle
3

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

A long erbt nicht int , daher gibt die Methode false zurück.

Wenn Sie einem int einen Wert long zuweisen, handelt es sich nicht nur um eine Zuweisung. Der Compiler fügt auch automatisch Code hinzu, um den int Wert in einen long Wert zu konvertieren.

    
Guffa 24.01.2011 11:16
quelle
3

Da Type.IsAssignableFrom eine .NET Framework-Funktion ist, ist die Zuweisung von "int" zu "long" eine C # -Sprache. Wenn Sie sich die generierte IL ansehen, sehen Sie dort eine Typkonvertierungsinstruktion. Es gibt viele Orte, an denen sich CLR-Regeln von denen in C # unterscheiden können, ein weiteres Beispiel ist die Überladungsauflösung in MethodBase.Invoke und die von C # -Compiler durchgeführte.

    
Konstantin Oznobihin 24.01.2011 11:28
quelle
2

Von Ссылка :

  

true, wenn c und der aktuelle Type den gleichen Typ darstellen oder wenn der aktuelle Type in der Vererbungshierarchie von c enthalten ist oder wenn der aktuelle Type eine Schnittstelle ist, die c implementiert, oder wenn c ein generischer Typparameter ist und der Der aktuelle Typ repräsentiert eine der Einschränkungen von c. false, wenn keine dieser Bedingungen erfüllt ist oder wenn c null ist.

Wie @BoltClock sagt, ist es nur implizite Konvertierung.

    
veggerby 24.01.2011 11:15
quelle

Tags und Links