2010-10-16 14 views
51

¿Cómo puedo crear un método que tenga parámetros opcionales y params juntos?C# 4.0, los parámetros opcionales y los params no funcionan juntos

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

Respuesta

33

Su única opción en este momento es sobrecargar el TestOptional (ya que había que hacer antes de C# 4). No preferido, pero limpia el código en el punto de uso.

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

Sí, esta es la única manera de lograr lo que el OP está pidiendo que yo sepa. No creo que sea necesariamente malo sin embargo. Solo crea un poco más de código, pero es lo suficientemente simple como para no ser confuso. – jlafay

+7

Además, esto no funciona para los atributos de información del llamador del método, como '[CallerMemberName]'. –

+0

Es posible, consulte mi respuesta a continuación – katbyte

11

Trate

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

que funciona bien para el ejemplo. pero cuando necesitaría una firma como esta, estoy obligado a especificar el tipo. public void TestOptional (T A, int B = 0, params Acción [] C) – MichaelD

+0

@MichaelD por lo que no te gusta escribir similar a: Acción test = x => Console.WriteLine (x); Acción test2 = y => Console.WriteLine (y); TestOptional ("A", C: new [] {test, test2}); ¿Lo entiendo bien o qué quiere decir? –

+0

Usando su método y la firma que comenté anteriormente. El analizador necesita el tipo 'nueva Acción []' y no solo 'nuevo []'. Esto produce mucho "ruido de código" cuando se trata de expresiones de tipos genéricos, etc. Ejemplo en la firma más simple: TestOptional ("A", C: nueva Acción [] {d => d.ToString(), d => d.ToString()}); – MichaelD

8

Esto funcionó para mí:

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

Esto no coincide con la firma que tiene el OP. La 'B' ahora es una cadena que puede ser nula. Además, esta respuesta cambió 'C' a un objeto. Esta es una respuesta a una pregunta diferente. Los tipos importan – CodeMonkeyKing

+1

La pregunta era "¿Cómo puedo crear un método que tenga parámetros opcionales y params juntos?" y mi respuesta mostró cómo hacerlo. Sin embargo, sí, utilicé diferentes tipos porque estaba tratando de lograr algo diferente. Lo suficientemente fácil como para cambiar los tipos para que coincidan. – katbyte

+1

Sí, esto funcionará. Agrega el desorden del nuevo [] {}, que no es exactamente la forma en que le gustaría escribir esto dado que la mayoría de las veces nunca tiene que hacer eso con un params, de hecho es inesperado tener que hacer eso. La pregunta del OP ilustra que el compilador no puede inferir un parámetro llamado 'params' usando la sintaxis de params en el sitio que llama. – CodeMonkeyKing

Cuestiones relacionadas