C# 初始化IEnumerable<;int>;作为可选参数

C# 初始化IEnumerable<;int>;作为可选参数,c#,ienumerable,C#,Ienumerable,在我的C#方法中有一个可选参数类型为IEnumerable。我是否可以使用除null以外的任何东西初始化它,例如固定的值列表?否-默认参数必须是编译时常量 最好的办法是重载该方法。或者,将默认值设置为null,然后在方法中检测null并将其转换为所需的列表。否。您只能有编译时常量。您可以将in赋值为null,然后 void SomeMethod(IEnumerable<int> list = null) { if(list == null) list = ne

在我的C#方法中有一个可选参数类型为
IEnumerable
。我是否可以使用除
null
以外的任何东西初始化它,例如固定的值列表?

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


最好的办法是重载该方法。或者,将默认值设置为null,然后在方法中检测null并将其转换为所需的列表。

否。您只能有编译时常量。您可以将in赋值为null,然后

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


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

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

不,您需要一个编译时常量

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

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

public void Foo(int arg1, IEnumerable<int> arg2)
{
      // do something
}
public void Foo(int arg1)
{
Foo(arg1,新[]{1,2,3});
}
公共void Foo(int arg1,IEnumerable arg2)
{
//做点什么
}

由于您需要编译时常量,因此必须将其设置为
null

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

 list = list ?? new List<int>(){1,2,3,4};
list=list??新列表(){1,2,3,4};

此模式真正令人敬畏的副作用是,如果您通过某个类库公开默认参数,您不会遇到默认参数的调用站点绑定问题,因为这允许您修改默认值,并使它们在库更新时生效。因此,避免这个问题:
numbers = numbers ?? new []{ 1, 2, 3}.AsEnumerable();
public void Foo(int arg1)
{
      Foo(arg1, new[] { 1, 2, 3 });
}

public void Foo(int arg1, IEnumerable<int> arg2)
{
      // do something
}
 list = list ?? new List<int>(){1,2,3,4};