2012-12-30 20 views
7

新.NET4.5 API在IntrospectionExtensions类为什么System.Reflection.IntrospectionExtensions.GetTypeInfo有无法访问的代码?

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

为什么这种方法具有无法访问的代码下面的逻辑?这是一个错误还是故意完成的?

+2

这是一些反编译器的输出?也许最初的源代码是'IReflectableType reflectableType = type作为IReflectableType;'和反编译器错了。 – dtb

+0

IL DASM显示(IL_0015:castclass System.Reflection.IReflectableType)not(isinst),所以有严格的强制转换。 –

回答

6

混淆是由Type类中定义的==运算符造成的。

如果你看看IL,你会看到调用操作符而不是ReferenceEquals

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

因此,代码实际上是在到达:)

+0

所以,据我所知 System.Type :: op_Equality(class System.Type,class System.Type) 如果type为NULL,则可以返回false iven。因为Type类没有显式的操作符和代码 if(reflectableType == null) {return(TypeInfo)null; // <<< this} 只有在类型为NULL时才可以访问。 –

+0

'Type :: op_Equality'和空检查不具有可比性,所以'Type :: op_Equality'可以返回的是无关紧要的。很明显,它有一些时髦的语义,但我不知道它们是否在我头顶; p – leppie

相关问题