将IEnumerable <int>初始化为可选参数</int>

时间:2013-01-10 09:56:39

标签: c# ienumerable

我的C#方法中有一个IEnumerable<int>类型的可选参数。我可以使用null以外的任何内容对其进行初始化,例如固定的价值清单?

5 个答案:

答案 0 :(得分:9)

没有。您只能拥有编译时常量。您可以指定为null,然后指定

void SomeMethod(IEnumerable<int> list = null)
{
    if(list == null)
        list = new List<int>{1,2,3};
}

下一个代码段来自C# in Depth着名的Jon Skeet书籍。他建议使用null作为参数的not set指标,它可能具有有意义的默认值。

static void AppendTimestamp(string filename,
                            string message,
                            Encoding encoding = null,
                            DateTime? timestamp = null)
{
     Encoding realEncoding = encoding ?? Encoding.UTF8;
     DateTime realTimestamp = timestamp ?? DateTime.Now;
     using (TextWriter writer = new StreamWriter(filename, true, realEncoding))
     {
         writer.WriteLine("{0:s}: {1}", realTimestamp, message);
     }
}

用法

AppendTimestamp("utf8.txt", "First message");
AppendTimestamp("ascii.txt", "ASCII", Encoding.ASCII);
AppendTimestamp("utf8.txt", "Message in the future", null, new DateTime(2030, 1, 1));

答案 1 :(得分:4)

否 - 默认参数必须是编译时常量。

你最好的选择是重载方法。或者,将默认值设置为null,并在方法内部检测null并将其转换为所需的列表。

答案 2 :(得分:4)

如何将其默认值设为null,并在方法

numbers = numbers ?? Enumerable.Empty<int>();

numbers = numbers ?? new []{ 1, 2, 3}.AsEnumerable();

答案 3 :(得分:3)

不,你需要一个编译时常量。

但你可以使用重载作为解决方法:

public void Foo(int arg1)
{
      Foo(arg1, new[] { 1, 2, 3 });
}

public void Foo(int arg1, IEnumerable<int> arg2)
{
      // do something
}

答案 4 :(得分:3)

因为你需要编译时常数,所以你必须将它设置为null

但您可以在方法中执行以下操作

 list = list ?? new List<int>(){1,2,3,4};
相关问题