2010-03-25 71 views
11

Tôi có một nghi ngờ liên quan đến quá tải phương thức C# và độ phân giải cuộc gọi.Tại sao C# gọi khác nhau cho các phương thức quá tải cho các giá trị khác nhau cùng loại?

Giả sử tôi có mã C# sau:

enum MyEnum { Value1, Value2 } 

public void test() { 
    method(0); // this calls method(MyEnum) 
    method(1); // this calls method(object) 
} 

public void method(object o) { 
} 

public void method(MyEnum e) { 
} 

Lưu ý rằng tôi biết làm thế nào để làm cho nó làm việc nhưng tôi muốn biết lý do tại sao cho một giá trị của int (0) nó gọi một phương pháp và cho khác (1) nó gọi khác. Nghe có vẻ khó xử vì cả hai giá trị đều có cùng kiểu (int) nhưng chúng được "liên kết" cho các phương thức khác nhau.

+2

Câu hỏi đầu tiên tuyệt vời! –

+0

Áp dụng cho tuyên bố này cũng MyEnum e = 0; Nhưng bạn sẽ nhận được lỗi trình biên dịch (yêu cầu chuyển đổi rõ ràng) nếu viết MyEnum e = 1; – RockWorld

+0

Bản sao của http://stackoverflow.com/questions/1633168/why-does-c-3-allow-the-implicit-conversion-of-literal-zero-0-to-any-enum –

Trả lời

7

Nghĩa đen 0 có thể chuyển đổi hoàn toàn thành bất kỳ loại nào enum, loại so khớp gần hơn object. Spec.

Xem, ví dụ: blogposts.

+1

0 hoàn toàn có thể chuyển đổi thành bất kỳ loại enum trong khi 1 không phải là !? – Galilyou

+0

@Galilyou: Đúng. – SLaks

+4

@Galilyou: trích dẫn từ Đặc tả Ngôn ngữ C# (phần 1.10): * "Để có giá trị mặc định của loại enum có thể dễ dàng, chữ 0 chuyển hoàn toàn thành bất kỳ loại enum nào." * –

1

Tôi khá chắc chắn để gọi

public void method(MyEnum e) { 
} 

đúng cách bạn cần phải vượt qua trong MyEnum.Value1 hoặc MyEnum.Value2. Enum! = Int loại, do đó tại sao bạn phải cast int vào loại enum của bạn. Vì vậy, (MyEnum)1 hoặc (MyEnum)0 sẽ hoạt động bình thường.

Trong trường hợp của bạn, 0 được chuyển hoàn toàn tới loại enum của bạn.

+2

Khi câu trả lời là (phần lớn) chính xác, đó không phải là những gì mà OP hỏi. –

+1

Đọc câu hỏi. – SLaks

+0

Tôi vẫn nghĩ rằng nó là đáng nói đến vì nó là tốt hơn cho khả năng đọc mã MyEnum.Value1 hơn để giả định rằng 0 sẽ ngầm đúc nó vào enum. Sau đó, bạn sẽ không phải lo lắng về việc rơi vào sai phương pháp quá tải –

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