C#4.0,可选参数和参数不能一起使用

Mic*_*elD 60 .net c# optional-parameters params 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());
}   
Run Code Online (Sandbox Code Playgroud)

Cod*_*ing 40

您现在唯一的选择是重载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());
}
Run Code Online (Sandbox Code Playgroud)

  • 此外,这不适用于方法调用者信息属性,例如`[CallerMemberName]`. (9认同)
  • 是的,这是完成OP所知道的唯一方法.我不认为这一定不好.只需创建一些代码,但它很简单,不会混淆. (2认同)

Mah*_*aga 15

尝试

TestOptional("A", C: new []{ "D", "E"});
Run Code Online (Sandbox Code Playgroud)


kat*_*yte 12

这对我有用:

    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();
    }
Run Code Online (Sandbox Code Playgroud)

  • 这与OP具有的签名不匹配.'B'现在是一个可以为null的字符串.此外,这个答案将"C"改为一个对象.这是对不同问题的回答.类型很重要. (2认同)
  • 是的,这将有效.它增加了新[] {}的混乱,这并不是你想要写这个的绝对方式,因为大多数时候你从来没有用params这样做,事实上,这是必然的.OP的问题说明编译器无法使用调用站点上的params语法推断出命名的"params"参数. (2认同)