2012-02-24 26 views
6

Đây không phải là một câu hỏi về thực hành mã hóa thích hợp, tôi chỉ làm việc thông qua ngữ nghĩa. cho phép nói rằng tôi có các nhà thầu sau đây ...C#: quá tải các nhà thầu với các tham số tùy chọn & các đối số được đặt tên?

public FooClass(string name = "theFoo") 
{ fooName = name; } 

public FooClass(string name, int num = 7, bool boo = true) : this(name) 
{ fooNum = num; fooBool = boo; } 

có thể sử dụng đối số được đặt tên như vậy ...?

FooClass foo1 = new FooClass(num:1); 

// nơi tôi chỉ đi qua một trong những tên tham số, dựa trên optionals để chăm sóc phần còn lại

hoặc gọi constructor FooClass (string, int, bool) không có đối số? như trong ...

FooClass foo2 = new FooClass(); 
+7

Thử dùng thử? Bạn có mã ngay tại đó ... bạn cho tôi biết nếu nó hoạt động! –

+0

ok, tôi nên đã chỉ định rằng mã ví dụ không hoạt động và tôi muốn biết cách làm cho nó hoạt động. – user1229895

Trả lời

5

Sử dụng các đối số được đặt tên và tùy chọn độ phân giải ảnh hưởng đến tình trạng quá tải trong các cách sau:

  • Một phương pháp, indexer, hoặc constructor là một ứng cử viên để thực hiện nếu mỗi người trong số các thông số của nó hoặc là tùy chọn hoặc tương ứng, theo tên hoặc theo vị trí, đến một đối số duy nhất trong câu lệnh gọi và đối số đó có thể được chuyển đổi thành loại tham số.

  • Nếu có nhiều hơn một ứng cử viên được tìm thấy, quy tắc giải quyết quá tải cho chuyển đổi ưu tiên được áp dụng cho các đối số được chỉ định rõ ràng. Các đối số được thừa nhận cho các tham số tùy chọn bị bỏ qua.

  • Nếu hai ứng viên được đánh giá là tốt như nhau, tùy chọn sẽ chuyển đến ứng cử viên không có tham số tùy chọn cho đối số nào bị bỏ qua trong cuộc gọi. Đây là hậu quả của tùy chọn chung về độ phân giải quá tải đối với các ứng viên có ít thông số hơn.

http://msdn.microsoft.com/en-us/library/dd264739.aspx

+0

Tôi hiểu rằng nó so sánh chữ ký, nhưng bạn có thể rephrase mã ví dụ của tôi để làm cho nó hoạt động? – user1229895

+0

Làm thế nào để nó "không hoạt động?" Liệu nó gọi là tình trạng quá tải sai? Nó có ném một ngoại lệ không? –

+0

xin lỗi nhập quá sớm ... như vậy cho trường hợp đầu tiên, mà không nói rõ một cách rõ ràng một cuộc tranh cãi tất cả optionals được bỏ qua, kết quả là chữ ký ít được gọi là ... và trong trường hợp thứ hai gọi sự quá tải với FooClass(), Điều đó là không thể... để câu trả lời là không thể sử dụng được đặt tên với các đối số tùy chọn bị bỏ qua? – user1229895

0

thông số bắt buộc được quy định tại phần cuối của danh sách tham số, sau khi bất kỳ thông số cần thiết. Nếu người gọi cung cấp một đối số cho bất kỳ một tham số nào của các tham số tùy chọn, nó phải cung cấp các đối số cho tất cả các tham số tùy chọn trước đó. Khoảng trống được phân tách bằng dấu phẩy trong danh sách đối số không được hỗ trợ.

Ngoài ra,

Đối số được đặt tên có thể theo các đối số vị trí, như được hiển thị tại đây. CalculateBMI (123, chiều cao: 64); Tuy nhiên, một đối số vị trí không thể theo một đối số được đặt tên. Câu lệnh sau gây ra lỗi trình biên dịch. // CalculateBMI (trọng lượng: 123, 64);

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