【问题标题】:Optional parameter of a dictionary error: Defualt parameter value for 'nodeInfo' must be compile-time constant字典错误的可选参数:“nodeInfo”的默认参数值必须是编译时常量
【发布时间】:2019-07-04 03:53:59
【问题描述】:

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

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

在传递“'nodeInfo' 的默认参数值大多数是编译时常量”的字典时,我不断收到错误消息。我该如何解决?谢谢

【问题讨论】:

  • 据我所知,这是 C# 的限制。您可以尝试通过将参数默认为 null 并使用 ??运算符或空检查,请参阅this question this seems to be a duplicate of
  • 来自here: "常量可以是数字、布尔值、字符串或空引用。 不要创建常量来表示您希望更改的信息随时。例如,不要使用常量字段来存储服务的价格、产品版本号或公司的品牌名称。这些值会随着时间而改变,并且因为编译器会传播常量,所以必须重新编译使用您的库编译的其他代码才能看到更改。”

标签: c# optional-parameters


【解决方案1】:

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

你有几个选择。

第一种是使用哨兵默认值,比如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:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多