2009-04-17 31 views
13

Trình biên dịch C# dường như lưu ý rõ ràng tất cả các giao diện, và các lớp cơ sở của nó thực hiện. Các thông số kỹ thuật của CLI nói rằng điều này không cần thiết. Tôi đã nhìn thấy một số trình biên dịch khác không phát ra điều này một cách rõ ràng, và nó có vẻ hoạt động tốt. Có bất kỳ sự khác biệt hoặc lý do C# thực hiện điều này?Tại sao trình biên dịch C# khai báo rõ ràng tất cả các giao diện một loại thực hiện?

Các MSIL rằng C# ở phía dưới tạo cho B là:

.class private auto ansi beforefieldinit B 
     extends A 
     implements IAdvanced, 
        ISimple 

Nó không nên cần phải xác định ISimple, vì A thực hiện nó cũng như IAdvanced. C# mã:

interface ISimple { 
    int Basic { get; } 
    int Zero { get; } 
} 
interface IAdvanced : ISimple { 
    string Major { get; } 
} 
class A : ISimple { 
    int ISimple.Basic { 
     get { return 1; } 
    } 
    int ISimple.Zero { 
     get{ return 0;} 
    } 
} 
class B : A, IAdvanced { 
    string IAdvanced.Major { 
     get { return "B"; } 
    } 
} 

Trả lời

7

Tôi không nghĩ rằng chúng ta có thể biết bất kỳ câu trả lời dứt khoát ở đây, trừ khi chúng tôi có trình biên dịch phát triển thả trong Tuy nhiên, chúng ta có thể đoán về lý do.. Có thể là:

  1. để tối ưu hóa - có lẽ nó tiết kiệm một số công việc cho trình biên dịch JIT.
  2. để dễ đọc - giúp mắt người dễ dàng nắm bắt được loại thực hiện khi nhìn vào đầu ra MSIL.
  3. vì đó là cách thực tập mùa hè thực hiện nó và vì nó hoạt động tốt, không ai sẽ thay đổi nó chỉ trong trường hợp nó phá vỡ một cái gì đó.
+0

IIRC, mọi thứ được xác định rõ ràng trong thông số kỹ thuật. Vì vậy, không đoán ở đây. – leppie

+0

Tôi sẽ đi đến số cửa ba! ;-) – peSHIr

+0

Yea, phân vùng II của thông số kỹ thuật CLI làm cho nó khá rõ ràng rằng nó không cần thiết. Tôi không nhìn thấy nếu nó nói rằng thêm nó thực sự làm bất cứ điều gì mặc dù. – MichaelGG

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