关于c#:可选参数“必须是编译时常量”,const仍然存在错误

Optional parameters “must be a compile-time constant” with a const still bugging

我都读过

可选参数"必须是编译时常量"

值的默认参数必须是编译时常量?

但这并没有在声明上进行编译,将Empty标记为非常量。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyClass
{
private const string Empty = string.Empty;

private string WriteFailedList(string prefix = Empty, DeployResponse Ret)
    {
        StringBuilder sb = new StringBuilder();
        var errorItems = Ret.Items.TakeWhile(item => item.Status == DeployItem.ItemStatus.Error);
        foreach (var item in errorItems)
            sb.AppendLine(string.Format("{0} {1}",prefix,item.Filename));
        return sb.ToString();
    }
}

@编辑:代码好的实践建议采取了乔恩斯基特。


您给出的代码有两个问题:

  • 可选参数必须排在最后(除了params参数)
  • const字段必须分配编译时常量,string.Empty不是常量字段
  • 因为Empty不是有效的const,所以您的默认值不是const。这只是第二个问题的推论。

这两个都很容易修复:

1
2
3
4
5
6
7
8
private const string Empty =""; // Literal rather than String.Empty
...

// Parameter name changed to be more readable and conventional
private string WriteFailedList(DeployResponse response, string prefix = Empty)
{
    ...
}

或者去掉你自己的Empty常量:

1
2
3
4
private string WriteFailedList(DeployResponse response, string prefix ="")
{
    ...
}

(我还建议您使用camelCase作为参数和局部变量,所以errorItems而不是errorItems。或者只是errors,事实上。我也会使用foreach循环,而不是调用ToList(),然后使用foreach