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这对我有用:
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,可选参数和参数不能一起工作的主要内容,如果未能解决你的问题,请参考以下文章