2010-10-16 33 views
51

Làm cách nào để tạo phương thức có tham số và tham số tùy chọn cùng nhau?C# 4.0, thông số và tham số tùy chọn không hoạt động cùng nhau

static void Main(string[] args) 
{ 

    TestOptional("A",C: "D", "E");//this will not build 
    TestOptional("A",C: "D"); //this does work , but i can only set 1 param 
    Console.ReadLine(); 
} 

public static void TestOptional(string A, int B = 0, params string[] C) 
{ 
    Console.WriteLine(A); 
    Console.WriteLine(B); 
    Console.WriteLine(C.Count()); 
} 

Trả lời

33

lựa chọn duy nhất của bạn ngay bây giờ là quá tải TestOptional (như bạn phải làm trước khi C 4 #). Không được ưa thích, nhưng nó làm sạch mã tại thời điểm sử dụng.

public static void TestOptional(string A, params string[] C) 
{ 
    TestOptional(A, 0, C); 
} 

public static void TestOptional(string A, int B, params string[] C) 
{ 
    Console.WriteLine(A); 
    Console.WriteLine(B); 
    Console.WriteLine(C.Count()); 
} 
+1

Vâng, đây là cách duy nhất để thực hiện những gì OP yêu cầu mà tôi biết. Tôi không nghĩ rằng nó nhất thiết phải xấu. Chỉ cần tạo thêm một chút mã nhưng nó đủ đơn giản để không gây nhầm lẫn. – jlafay

+7

Ngoài ra, điều này không hoạt động đối với Thuộc tính thông tin người gọi phương thức, chẳng hạn như '[CallerMemberName]'. –

+0

Có thể, xem câu trả lời của tôi dưới đây – katbyte

11

Hãy thử

TestOptional("A", C: new []{ "D", "E"}); 
+0

hoạt động tốt cho ví dụ. nhưng khi tôi cần chữ ký như thế này, tôi bắt buộc phải chỉ định loại. public static void TestOptional (T A, int B = 0, params Hành động [] C) – MichaelD

+0

@MichaelD vì vậy bạn không thích viết tương tự như: Hành động test = x => Console.WriteLine (x); Hành động test2 = y => Console.WriteLine (y); TestOptional ("A", C: new [] {test, test2}); Tôi hiểu chính xác hay ý của bạn là gì? –

+0

Sử dụng phương pháp của bạn và chữ ký tôi đã nhận xét trước đó. Trình phân tích cú pháp cần loại 'new Action []' ant không chỉ 'new []'. Điều này dẫn đến nhiều 'mã-tiếng ồn' khi xử lý các biểu thức của các kiểu generic và vân vân. Ví dụ về chữ ký đơn giản hơn: TestOptional ("A", C: new Action [] {d => d.ToString(), d => d.ToString()}); – MichaelD

8

này đã làm việc cho tôi:

static void Main(string[] args) { 

     TestOptional("A"); 
     TestOptional("A", 1); 
     TestOptional("A", 2, "C1", "C2", "C3"); 

     TestOptional("A", B:2); 
     TestOptional("A", C: new [] {"C1", "C2", "C3"}); 

     Console.ReadLine(); 
    } 

    public static void TestOptional(string A, int B = 0, params string[] C) { 
     Console.WriteLine("A: " + A); 
     Console.WriteLine("B: " + B); 
     Console.WriteLine("C: " + C.Length); 
     Console.WriteLine(); 
    } 
+1

Điều này không khớp với chữ ký mà OP có. 'B' bây giờ là một chuỗi có thể là null. Ngoài ra câu trả lời này đã thay đổi 'C' thành một đối tượng. Đây là câu trả lời cho một câu hỏi khác. Các loại quan trọng. – CodeMonkeyKing

+1

Câu hỏi đặt ra là "Làm cách nào tôi có thể tạo phương thức có tham số và thông số tùy chọn cùng nhau?" và câu trả lời của tôi cho thấy làm thế nào để làm như vậy. Tuy nhiên có tôi đã sử dụng các loại khác nhau bởi vì tôi đã cố gắng để thực hiện một cái gì đó khác nhau. Đủ dễ dàng để thay đổi các loại để phù hợp. – katbyte

+1

Có điều này sẽ hoạt động. Nó bổ sung thêm sự lộn xộn của [] {} mới, không chính xác cách bạn muốn viết điều này vì hầu hết thời gian bạn không bao giờ phải làm điều đó với một tham số, trên thực tế nó là bất ngờ khi phải làm điều đó. Câu hỏi của OP minh họa rằng trình biên dịch không thể suy ra tham số 'params' được đặt tên bằng cách sử dụng cú pháp params tại trang gọi. – CodeMonkeyKing

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