2013-06-17 43 views
9

Các quy tắc khi giải quyết số tham số biến được thông qua bởi params là gì?Giải quyết các thông số trong C#

Giả sử, rằng tôi có mã:

public void Method(params object[] objects) { } 

public void Method(IMyInterface intf, params object[] objects) { } 

như thế nào Method(a, b, c) giải quyết, nếu a là một IMyInterface? Tôi có thể chắc chắn rằng C# sẽ luôn cố gắng chọn quá tải phù hợp nhất?

+0

Chăm sóc bình luận về downvote? – Spook

Trả lời

11

này được trả lời bằng cách spec ngôn ngữ C#:

7.5.3.1 viên chức năng áp dụng

[...]

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

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

[...]

Trong ví dụ của bạn cả hai quá tải sẽ chỉ áp dụng các hình thức mở rộng của họ. Vì thứ hai có nhiều tham số khai báo hơn, nên nó sẽ là tốt hơn.

Trong bối cảnh của thông số, một quá tải là tốt hơn hơn tất cả những người khác có nghĩa là trình biên dịch chọn nó để ràng buộc cuộc gọi, như sẽ xảy ra trong ví dụ dưới thảo luận (nếu không có quá tải nào tốt hơn tất cả những người khác, kết quả là một lỗi biên dịch thời gian do sự mơ hồ).

+0

Dạng mở rộng của các tham số phương thức là gì? –

+0

@gmailuser: Theo thuật ngữ của giáo dân, bạn đang sử dụng "dạng mở rộng" nếu xóa 'params' khỏi định nghĩa phương thức sẽ làm cho phương thức gọi không biên dịch. Lấy quá tải đầu tiên, 'Method (new object [] {" foo "})' là dạng bình thường bởi vì đối số chính thức là một 'object []' và đó là những gì bạn đang truyền. 'Method (" foo ")' là dạng mở rộng bởi vì bạn dựa vào trình biên dịch để tạo 'object []' cho bạn, và nó sẽ không thể có nếu không có 'params'. – Jon

3

Xem thêm C# Spec. 17.5.1.4 regarding Parameter arrays

Khi thực hiện giải quyết tình trạng quá tải, một phương pháp với một tham số mảng có thể áp dụng một trong hai hình thức bình thường của nó hoặc dưới hình thức mở rộng của nó (§14.4.2.1). 2 Hình thức mở rộng của phương pháp chỉ khả dụng nếu hình thức thông thường của phương pháp không áp dụng và chỉ khi phương thức có cùng chữ ký với dạng mở rộng chưa được khai báo trong loại .

Ví dụ

using System; 
class Test 
{ 
    static void F(params object[] a) { 
     Console.WriteLine("F(object[])"); 
    } 
    static void F() { 
     Console.WriteLine("F()"); 
    } 
    static void F(object a0, object a1) { 
     Console.WriteLine("F(object,object)"); 
    } 
    static void Main() { 
     F(); 
     F(1); 
     F(1, 2); 
     F(1, 2, 3); 
     F(1, 2, 3, 4); 
    } 
} 

sản xuất đầu ra:

F(); 
F(object[]); 
F(object,object); 
F(object[]); 
F(object[]); 
Các vấn đề liên quan