2012-12-30 22 views
7

Nuovo .NET4.5 API ha la seguente logica in IntrospectionExtensions classePerché System.Reflection.IntrospectionExtensions.GetTypeInfo ha un codice irraggiungibile?

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(); 
} 

Perché questo metodo ha codice irraggiungibile? È un bug o è fatto intenzionalmente?

+2

È questo l'uscita di alcuni decompilatore? Forse il codice sorgente originale era 'IReflectableType reflectableType = type come IReflectableType;' e il decompilatore ha sbagliato. – dtb

+0

IL DASM mostra (IL_0015: castclass System.Reflection.IReflectableType) non (isinst), quindi esiste un cast rigoroso. –

risposta

6

La confusione è causata dall'operatore == definito nella classe Type.

Se si guarda l'IL, verrà visualizzato l'operatore al posto di ReferenceEquals.

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

Così il codice è infatti raggiungibile :)

+0

Quindi, come ho capito System.Type :: op_Equality (class System.Type, class System.Type) può restituire false iven se type è NULL. Perché la classe Type non ha operatori di cast espliciti e il codice if (reflectableType == null) {return (TypeInfo) null; // <<< this} sarà raggiungibile solo se type è NULL. –

+0

'Type :: op_Equality' e il controllo null non è confrontabile, quindi è irrilevante cosa può restituire' Type :: op_Equality'. Ovviamente, ha qualche semantica funky, ma non li conosco dalla mia testa, p – leppie

Problemi correlati