Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 4.0 C#4.0:数组形式的方法参数默认值_.net 4.0_C# 4.0 - Fatal编程技术网

.net 4.0 C#4.0:数组形式的方法参数默认值

.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是值

在C#4.0方法中,是否可以将默认值参数作为数组(例如字符串[]sArray)? 如果是,如何实施

我尝试了如下调用函数:

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类型,是吗?