【问题标题】:C# 4.0, optional parameters and params do not work togetherC# 4.0,可选参数和参数不能一起工作
【发布时间】: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());
}   

【问题讨论】:

    标签: c# .net c#-4.0 params optional-parameters


    【解决方案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”参数。
    猜你喜欢
    • 2012-10-08
    • 2016-11-19
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多