【问题标题】:How to specify default value for List<> parameter in a c# function?如何在 c# 函数中为 List<> 参数指定默认值?
【发布时间】:2011-12-06 10:15:04
【问题描述】:

我有一个 C# 方法,它接受一堆参数,所有参数都有默认值。参数之一是列表。我不知道如何指定 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' 的默认参数值必须是编译时常量”。

有什么想法吗?

【问题讨论】:

  • 顺便说一句,参数类型应该尽可能宽。最好使用IList&lt;string&gt; 或(最好)IEnumerable&lt;string&gt;
  • 我从未在接受机制的任何地方找到明确的说明。查看常见问题解答,我没有看到有关它的信息...?
  • @StephenGross,只需勾选最有可能帮助未来访问者解决相同问题的答案旁边的绿色框即可。 :)
  • 我知道绿框在那里;我不清楚的是upvote/downvote/accept的指导方针。任何地方都有这样的指导方针吗?
  • @StephenGross,请参阅常见问题解答中的how-to-ask 部分。

标签: c#


【解决方案1】:

因为默认参数值必须是编译时表达式,所以引用类型唯一可接受的默认参数值是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
}

或者,如果消息只用在一个地方,你可以使用空合并运算符来替换一个空枚举:

 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 可以更有效。真的取决于您是否要将其视为空可枚举或空列表或只是绕过逻辑......

【讨论】:

    【解决方案2】:

    正如错误消息明确指出的那样,您不能将引用类型的任意实例作为默认值。
    您只能使用文字、consts 或 null

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

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

    【讨论】:

      【解决方案3】:

      messages 也设为默认null,并在函数体中检查其是否为null 并进行适当处理(或将其替换为new List())。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2011-03-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-12
            • 2020-04-07
            • 2017-09-19
            • 2017-06-13
            相关资源
            最近更新 更多