字典错误的可选参数:'nodeInfo'的Defualt参数值必须是编译时常量

时间:2019-02-10 14:17:31

标签: c# optional-parameters

我正在尝试定义一个新的子例程,该子例程将字典作为可选参数,并将默认值作为一个空字典以及两个非可选字符串。

public void findPath(string start, string end,
    Dictionary<string, object[]> nodeInfo = new Dictionary<string, object[]>())
{}

传递字典时,我始终收到错误消息,即“ 'nodeInfo'的默认参数值最应该是编译时常量”。我该如何解决?谢谢

1 个答案:

答案 0 :(得分:3)

不能,不能直接。参数的默认值必须是编译时常量。

您有几个选择。

第一种是使用前哨默认值,例如null

public void findPath(string start, string end,
    Dictionary<string, object[]> nodeInfo = null)
{
    if (nodeInfo == null)
        nodeInfo = new Dictionary<string, object[]>();
}

第二种是使用方法重载:

public void findPath(string start, string end)
{
    findPath(start, end, new Dictionary<string, object[]>();
}

public void findPath(string start, string end,
    Dictionary<string, object[]> nodeInfo)
{
}

它们必须是编译时常量,因为它们被烘焙到调用该方法的位置。例如,如果您使用null作为标记值并编写了以下代码:

findPath("start", "end");

它被编译为此:

findPath("start", "end", null);

有关允许作为默认参数值的内容,请参见MSDN documentation

  
      
  • 一个常量表达式;
  •   
  • 形式为new ValType()的表达式,其中ValType是值类型,例如枚举或结构;
  •   
  • 形式为default(ValType)的表达式,其中ValType是值类型。
  •   

Constant expressions

  

常量可以是数字,布尔值,字符串或空引用