2012-12-30 6 views
7

New .NET4.5 API hat die folgende Logik in IntrospectionExtensions KlasseWarum hat System.Reflection.IntrospectionExtensions.GetTypeInfo nicht erreichbaren Code?

public static TypeInfo GetTypeInfo(this Type type) 
{ 
    if (type == (Type) null) 
    throw new ArgumentNullException("type"); 
    IReflectableType reflectableType = (IReflectableType) type; 
    if (reflectableType == null) 
    return (TypeInfo) null; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE! 
    else 
    return reflectableType.GetTypeInfo(); 
} 

Warum diese Methode nicht erreichbar Code hat? Ist das ein Fehler oder absichtlich?

+2

Ist das die Ausgabe von einigen Decompiler? Vielleicht war der ursprüngliche Quellcode "IReflectableType reflectibleType = type als IReflectableType" und der Decompiler hat es falsch verstanden. – dtb

+0

IL DASM zeigt (IL_0015: castclass System.Reflection.IReflectableType) nicht (isinst), also gibt es einen strikten Cast. –

Antwort

6

Die Verwechslung wird durch den Operator == verursacht, der in der Klasse Type definiert ist.

Wenn Sie sich die IL ansehen, sehen Sie, dass der Operator anstelle von ReferenceEquals aufgerufen wird.

L_0002: call bool System.Type::op_Equality(class System.Type, class System.Type) 

So ist der Code in der Tat erreichbar :)

+0

So, wie ich es verstehe System.Type :: op_Equality (Klasse System.Type, Klasse System.Type) kann false iven zurückgeben, wenn Typ NULL ist. Weil die Klasse "type" keine expliziten Umwandlungsoperatoren und keinen Code enthält if (reflectibleType == null) {return (TypeInfo) null; // <<< this} wird nur erreichbar sein, wenn der Typ NULL ist. –

+0

'Type :: op_Equality' und der Null-Check ist nicht vergleichbar, so ist es irrelevant, was' Type :: op_Equality' zurückgeben kann. Offensichtlich hat es eine funky Semantik, aber ich kenne sie nicht von ganz oben; – leppie