我已经阅读了两个
Optional parameters "must be a compile-time constant"
和
Default parameter for value must be a compile time constant?
但这不会在声明上进行编译,将Empty
标记为非常数。
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();
}
}
@Edit:从Jon Skeet采取的代码良好实践建议。
答案 0 :(得分:1)
您提供的代码有两个问题:
params
参数)const
字段必须分配编译时常量,而string.Empty
不是 const字段Empty
不是有效const
,因此您的默认值不是const
。这只是第二个问题的必然结果。这两个都很容易修复:
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
常数:
private string WriteFailedList(DeployResponse response, string prefix = "")
{
...
}
(我还建议您使用camelCase
作为参数和局部变量 - 所以errorItems
而不是ErrorItems
。或者只是errors
,实际上。{I>我还使用foreach
循环而不是调用ToList()
,然后使用ForEach
。)