.net 4.0 C#4.0:数组形式的方法参数默认值
在C#4.0方法中,是否可以将默认值参数作为数组(例如字符串[]sArray)? 如果是,如何实施 我尝试了如下调用函数:.net 4.0 C#4.0:数组形式的方法参数默认值,.net-4.0,c#-4.0,.net 4.0,C# 4.0,在C#4.0方法中,是否可以将默认值参数作为数组(例如字符串[]sArray)? 如果是,如何实施 我尝试了如下调用函数: MethodA(string[] legends=new string[]{"a","b"},float[] values=new float[]{1,2}, string alt="sd"); 它不起作用默认值必须是编译时常量,这意味着不能使用数组 标准(第312页)规定: 默认参数中的表达式必须是以下表达式之一: 恒量表达式 形式为new S()的表达式,其中S是值
MethodA(string[] legends=new string[]{"a","b"},float[] values=new float[]{1,2}, string alt="sd");
它不起作用默认值必须是编译时常量,这意味着不能使用数组 标准(第312页)规定: 默认参数中的表达式必须是以下表达式之一:
- 恒量表达式
- 形式为new S()的表达式,其中S是值类型
- 默认形式的表达式,其中S是值类型
正如其他人所说,默认值不能是数组。但是,避免这种情况的一种方法是将默认值设为null,然后在必要时初始化数组:
public void Foo(int[] x = null)
{
x = x ?? new int[] { 5, 10 };
}
或者,如果您不打算改变数组或将其公开给调用方:
private static readonly int[] FooDefault = new int[] { 5, 10 };
public void Foo(int[] x = null)
{
x = x ?? FooDefault;
}
请注意,这假定null
不是您希望用于任何其他原因的值。这不是一个全局适用的想法,但在某些情况下,如果您不能将默认值表示为编译时常量,它会很好地工作。对于编码.UTF8
之类的东西,您可以使用相同的东西作为默认编码
如果需要值类型参数,可以将其设置为可为null的参数。例如,假设您希望将一个参数默认为处理器数量(这显然不是编译时常量),您可以执行以下操作:
public void RunInParallel(int? cores = null)
{
int realCores = cores ?? Environment.ProcessorCount;
}
哇,太可怕了。这和属性的问题是一样的,只是我很确定你可以为它们使用数组。为什么不能声明初始化的数组?他们是constant@Graphain:除空1常量外,任何数组以何种方式存在?非空数组总是可变的。编译器必须在每次调用时创建一个数组的副本,以防有什么东西(例如被调用的方法)更改了内容。@Jon Skeet-如果默认值需要一个常量,那么编译器将足够聪明,可以将数组视为只读。唯一改变的方法是,如果有人修改反射权限,这对于真正的常量(例如字符串等)也是一样的问题。@Graphain:没有只读数组。该方法是否也不能将其传递给任何接受数组参数的其他对象?“你说的基本上是另一种类型的人,”乔恩·斯基特,我错了。它仍然不允许您使用只读IEnumerable类型,是吗?