2012-12-30 43 views
7

New .NET4.5 API có logic sau đây trong IntrospectionExtensions lớpTại sao System.Reflection.IntrospectionExtensions.GetTypeInfo có mã không thể truy cập?

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

Tại sao phương pháp này có mã unreachable? Đây có phải là lỗi hoặc được thực hiện cố tình không?

+2

Đây có phải là kết quả của một số decompiler? Có lẽ mã nguồn ban đầu là 'IReflectableType reflectableType = type như IReflectableType; 'và trình dịch ngược đã làm cho nó sai. – dtb

+0

IL DASM cho thấy (IL_0015: castclass System.Reflection.IReflectableType) không (isinst), do đó, có một diễn viên nghiêm ngặt. –

Trả lời

6

Sự nhầm lẫn gây ra bởi toán tử == được xác định trên lớp Type.

Nếu bạn nhìn vào IL, bạn sẽ thấy toán tử được gọi thay vì ReferenceEquals.

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

Vì vậy, mã này là trong thực tế có thể truy cập :)

+0

Vì vậy, khi tôi hiểu System.Type :: op_Equality (lớp System.Type, class System.Type) có thể trả về false iven nếu loại là NULL. Vì lớp Loại không có toán tử truyền rõ ràng và mã nếu (reflectableType == null) {return (TypeInfo) null; // <<< this} sẽ chỉ có thể truy cập nếu loại là NULL. –

+0

'Loại :: op_Equality' và kiểm tra null không thể so sánh, vì vậy nó không liên quan gì' Type :: op_Equality' có thể trả về. Rõ ràng, nó có một số ngữ nghĩa sôi nổi, nhưng tôi không biết chúng ra khỏi đỉnh đầu của tôi; – leppie

Các vấn đề liên quan