我正在尝试定义一个新的子例程,该子例程将字典作为可选参数,并将默认值作为一个空字典以及两个非可选字符串。
public void findPath(string start, string end,
Dictionary<string, object[]> nodeInfo = new Dictionary<string, object[]>())
{}
传递字典时,我始终收到错误消息,即“ 'nodeInfo'的默认参数值最应该是编译时常量”。我该如何解决?谢谢
答案 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是值类型。
常量可以是数字,布尔值,字符串或空引用