2010-10-16 4 views
51

Как создать метод, который имеет необязательные параметры и параметры вместе?C# 4.0, необязательные параметры и параметры не работают вместе

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()); 
} 

ответ

33

Ваш единственный вариант прямо сейчас перегружать TestOptional (как вы должны были сделать перед C# 4). Не рекомендуется, но он очищает код в момент использования.

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

Да, это единственный способ добиться того, что ОП спрашивает, что я знаю. Я не думаю, что это обязательно плохо. Просто создает немного больше кода, но это достаточно просто, чтобы не путать. – jlafay

+7

Кроме того, это не работает для атрибутов информации метода Caller, таких как '[CallerMemberName]'. –

+0

Возможно, см. Мой ответ ниже – katbyte

11

Попробуйте

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

, который хорошо работает на примере. но когда мне понадобится такая подпись, я обязан указать тип. государственный статический сила TestOptional (T A, Int B = 0, Params Действие [] C) – MichaelD

+0

@MichaelD так что вы не любите писать похожий на: действий теста = х => Console.WriteLine (х); Действие test2 = y => Console.WriteLine (y); TestOptional («A», C: new [] {test, test2}); Я правильно понимаю или что вы имеете в виду? –

+0

Используя ваш метод и подпись, которую я ранее прокомментировал. Парсеру нужен тип «новое действие» [] 'ant, а не только' new [] '. Это приводит к значительному «кодовому шуму» при работе с выражениями общих типов и т. Д. Пример более простой подписи: TestOptional («A», C: new Действие [] {d => d.ToString(), d => d.ToString()}); – MichaelD

8

Это работает для меня:

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

Это не соответствует подписи, которую имеет OP. «B» теперь является строкой, которая может быть нулевой. Кроме того, этот ответ изменил «C» на объект. Это ответ на другой вопрос. Типы имеют значение. – CodeMonkeyKing

+1

Вопрос: «Как я могу создать метод, который имеет необязательные параметры и параметры вместе?» и мой ответ показал, как это сделать. Однако да, я использовал разные типы, потому что пытался сделать что-то другое. Достаточно легко изменить типы для соответствия. – katbyte

+1

Да, это сработает. Он добавляет беспорядок нового [] {}, что не совсем так, как вы хотели бы написать это, учитывая, что большую часть времени вам никогда не придется делать с параметрами, на самом деле это неожиданно. В вопросе OP показано, что компилятор не может вывести параметр «params» с использованием синтаксиса params на вызывающем сайте. – CodeMonkeyKing

Смежные вопросы