C# 4.0,可选参数和参数不能一起工作

Posted

技术标签:

【中文标题】C# 4.0,可选参数和参数不能一起工作【英文标题】:C# 4.0, optional parameters and params do not work together 【发布时间】:2011-04-26 07:49:20 【问题描述】:

如何创建一个同时具有可选参数和参数的方法?

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

【问题讨论】:

【参考方案1】:

您现在唯一的选择是重载 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());

【讨论】:

是的,这是完成我所知道的 OP 要求的唯一方法。我认为这不一定是坏事。只需创建更多代码,但它足够简单,不会造成混淆。 另外,这不适用于方法调用者信息属性,例如[CallerMemberName] 有可能,请看下面我的回答【参考方案2】:

试试

TestOptional("A", C: new [] "D", "E");

【讨论】:

这个例子很好用。但是当我需要这样的签名时,我有义务指定类型。 public static void TestOptional(T A, int B = 0, params Action[] C) @MichaelD 所以你不喜欢写类似于: Action test = x => Console.WriteLine(x); Action test2 = y => Console.WriteLine(y); TestOptional("A", C: new [] test, test2 );我理解正确还是你的意思? 使用您的方法和我之前评论过的签名。解析器需要类型 'new Action[]' 而不仅仅是 'new[]'。在处理泛型类型的表达式等时,这会导致很多“代码噪音”。简单签名示例:TestOptional("A",C: new Action[] d=>d.ToString(),d=>d.ToString());【参考方案3】:

这对我有用:

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

【讨论】:

这与 OP 的签名不匹配。 'B' 现在是一个可以为空的字符串。此外,此答案将“C”更改为对象。这是对不同问题的回答。类型很重要。 问题是“如何创建一个同时具有可选参数和参数的方法?”我的回答显示了如何做到这一点。但是,是的,我使用了不同的类型,因为我试图完成一些不同的事情。很容易更改要匹配的类型。 是的,这会起作用。它增加了 new[] 的混乱,这并不是你想要写这个的方式,因为大多数时候你不需要用 params 来做这件事,事实上不得不这样做是出乎意料的。 OP 的问题说明编译器无法在调用站点使用 params 语法推断命名的“params”参数。

以上是关于C# 4.0,可选参数和参数不能一起工作的主要内容,如果未能解决你的问题,请参考以下文章

C#中可选参数和具名参数的使用

C#4.0中的更改——命名参数和可选参数

C# 4.0:我可以使用 TimeSpan 作为具有默认值的可选参数吗?

C#终于支持可选参数了!

C#4.0中的方法重载与可选参数[重复]

C#参数知识盘点,形/实参值/引用传递refoutinparams可选命名等