2010-06-26 19 views
11

Các mã sau biên dịch trong C# 4.0:Nhiều hay ít bằng quá tải

void Foo(params string[] parameters) { } 
void Foo(string firstParameter, params string[] parameters) { } 

Làm thế nào để trình biên dịch biết được quá tải bạn đang gọi điện thoại? Và nếu nó không thể, tại sao mã vẫn còn biên dịch?

+7

+1, câu hỏi thú vị, mặc dù nó có thể đã được trả lời trong thông số kỹ thuật. –

Trả lời

13

Nó cũng được quy định trong C# Language Specification, chương 7.4.3.2, "viên chức năng tốt hơn":

Ngược lại, nếu MP được áp dụng theo hình thức bình thường của nó và MQ có một mảng params và chỉ áp dụng ở dạng mở rộng, MP tốt hơn MQ

Nếu không, nếu MP có ít thông số khai báo hơn MQ thì MP tốt hơn MQ. Điều này có thể xảy ra nếu cả hai phương thức đều có các mảng params và chỉ áp dụng trong các dạng mở rộng của chúng.

Fwiw, đặc tả ngôn ngữ C# là rất tài liệu có thể đọc và có thể giúp bạn tự giải quyết các câu đố này. Bạn có nó trên máy tính của bạn, tìm thấy nó trở lại trong thư mục cài đặt Visual Studio (như c: \ program files \ microsoft visual studio 9.0) trong thư mục con vC# \ specifications \ 1033.

Một tài liệu tốt khác là tài liệu chuẩn Ecma-335, có sẵn miễn phí dưới dạng PDF download. Nó chỉ rõ hành vi của CLR và trình biên dịch JIT, tài liệu tuyệt vời để hiểu tại sao C# (và CLR) làm những gì chúng làm. Được đề xuất.

+1

Thú vị. Nếu tôi lấy mã OP và gọi 'Foo (" một ")' trình biên dịch chọn phương thức thứ hai (vs2010, .net 4), có vẻ sai theo báo giá đó. Cách duy nhất mà tôi quản lý để gọi phương thức đầu tiên là truyền một mảng chuỗi làm đối số duy nhất. –

+0

@ Fredrik: sai lầm của tôi, bỏ lỡ một quy tắc. –

+0

Bây giờ nó có ý nghĩa hơn :) –

6

Trong một số trường hợp, it will decide for you. Vì vậy, bạn có thể muốn sử dụng tên khác nhau trong các trường hợp như thế này (hoặc trong trường hợp hữu ích hơn :-)).

Đặc biệt, trong số bốn trường hợp:

 Foo("bar"); 
     Foo("bar", "bar"); 
     Foo(new string[]{"bar", "bar"}); 
     Foo("bar", new string[] { "bar", "bar" }); 

chỉ # 1 và # 2 là 'mơ hồ' (kể từ # 3 và # 4 tự nhiên phù hợp với tình trạng quá tải 1 và 2 tương ứng).

Trong trường hợp độ phân giải quá tải # 1 và # chọn quá tải # 2, vì nó có tham số chuỗi độc lập khớp với tham số duy nhất/thứ nhất của lệnh gọi.

+0

Điều đó thực sự có ý nghĩa. – user230821

+0

Ồ vâng, nó có ý nghĩa. Tôi có nghĩa là nó không phải là rất hữu ích để có 2 quá tải như vậy. – Mau

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