2013-04-09 31 views
12

Tôi không hiểu tại sao nó hoạt động ...Phép thuật IComparable - tại sao nó là một tuyên bố hợp lệ?

class Program 
{ 
    static void Main(string[] args) 
    { 
     IComparable.Equals(12, 3); 
    } 
} 

Mã IL:

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  21 (0x15) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ldc.i4.s 12 
    IL_0003: box  [mscorlib]System.Int32 
    IL_0008: ldc.i4.3 
    IL_0009: box  [mscorlib]System.Int32 
    IL_000e: call  bool [mscorlib]System.Object::Equals(object, 
                 object) 
    IL_0013: pop 
    IL_0014: ret 
} // end of method Program::Main 

Nó biên dịch để bool Object.equals (Object, Object), nhưng tại sao?

+1

Chà, điều đó đã khiến tôi nổi bật trong một giây. Lưu ý rằng nó làm việc với giao diện * any * (lớp, enum và), và cho bất kỳ kiểu tham số nào - tất nhiên (một khi bạn nghĩ về nó). –

+0

Thực sự làm việc với tất cả các giao diện, nhưng lý do đằng sau nó là gì? – boli

+0

Hãy xem câu trả lời của David. –

Trả lời

12

Nó biên dịch thành bool Object.Equals(Object,Object), nhưng tại sao?

"Tại sao?" câu hỏi là không chính xác và khó trả lời, vì vậy thay vào đó tôi sẽ trả lời "cái gì?" câu hỏi.

Phần nào của đặc tả C# biện minh cho tính hợp pháp của hành vi kỳ lạ này?

mục 7.4 của C# đặc điểm kỹ thuật nói rằng khi bạn đang làm một tra cứu viên của các hình thức T.N

... tập bao gồm tất cả các thành viên truy cập tên N trong T, trong đó có các thành viên được thừa hưởng và các thành viên truy cập tên N trong đối tượng ... [nhấn mạnh thêm]

object.Equals là một thành viên truy cập tên Equals trong object, do đó, nó là một ứng cử viên.

+1

Tại sao nó được thiết kế theo cách đó thay vì làm cho mọi thứ có 'đối tượng' như tổ tiên tối thượng? Và có vẻ như tôi sẽ cần xóa câu trả lời của tôi ....... –

+1

Thật kỳ lạ, PowerShell không cho phép điều này. Ví dụ trong PowerShell '[DayOfWeek] :: Equals (12, 3)' hoạt động tốt, nhưng '[IDisposable] :: Equals (12, 3)' than phiền phương thức không tồn tại. –

+0

Cảm ơn bạn đã trả lời, Thật đáng để đọc thông số C# ít nhất một lần. – boli

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