如何为List<>指定默认值c#函数中的参数?

时间:2011-10-12 19:34:15

标签: c#

我有一个C#方法,它接受一堆参数,所有参数都有默认值。其中一个参数是List。我无法弄清楚如何指定List应该默认为空。这是它的样子:

    public static void execute(
        String condition = "Unnamed condition",
        List<String> messages,
        Object actual    = null,
        Object expected  = null)

我无法弄清楚如何指定默认情况下消息应为空。当我进入:

...
List<String> messages = new List<String> ()
...

它抱怨“'messages'的默认参数值必须是编译时常量”。

有什么想法吗?

5 个答案:

答案 0 :(得分:9)

由于默认参数值必须是编译时表达式,因此引用类型唯一可接受的默认参数值为null

你可以通过超载解决这个问题:

 public static void execute(String condition = "Unnamed condition")
 {
     execute(condition, new List<String>(), null, null);
 }

如果参数为null,则构建列表。如果您必须需要一个列表,并希望将所有null视为空列表,那么如果他们明确地使用null进行调用,也可以处理。

 public static void execute(String condition = "Unnamed condition",
        List<String> messages = null, Object actual = null,
        Object expected = null)
{
    // if you really want this to be empty if null, can check and assign.
    if (messages == null)
    {
        messages = new List<String>();
    }

    // your other logic
}

或者,如果消息仅在一个地方使用,则可以使用null-coallescing运算符替换空枚举:

 public static void execute(String condition = "Unnamed condition",
        List<String> messages = null, Object actual = null,
        Object expected = null)
{
    // assuming you are using messages once for iteration or something...
    foreach(var msg in messages ?? Enumerable.Empty<String>())
    ...
}

虽然显然一个简单的if-guard可以更有效率。真的取决于你是想把它当作一个空的可枚举或空列表,还是只是绕过逻辑......

答案 1 :(得分:3)

正如错误消息明确指出的那样,您不能将引用类型的任意实例作为默认值 您可以使用的只是文字,constnull

相反,您可以将默认值设置为null,然后写入

messages = messages ?? new List<string>();

答案 2 :(得分:2)

messages默认设置为null,并在功能正文中检查其null是否适当处理(或将其替换为new List())。< / p>

答案 3 :(得分:2)

编译器在这里唯一接受的是null。如果方便,您的方法将需要测试这种情况并替换空列表:

if(messages==null) {
  messages=new List<String>();
}

答案 4 :(得分:1)

编译器告诉你原因:默认参数必须是编译时常量。显然,动态分配和构造的列表不符合该描述。最简单的解决方法是设置默认值null,然后在您的方法中,如果参数为null,则创建实际的默认列表。