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

I've read both

Optional parameters "must be a compile-time constant"

And

Default parameter for value must be a compile time constant?

But this keeps not compiling on the declaration, marking Empty as a non constant.

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: Code good practice suggestions taken from Jon Skeet.

Jon Skeet
people
quotationmark

The code you've given has two problems:

  • Optional parameters must come last (apart from params parameters)
  • const fields must be assigned compile-time constants, and string.Empty isn't a const field
  • Because Empty isn't a valid const, your default value isn't const. This is just a corollary of the second issue

Both of these are easily fixed:

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)
{
    ...
}

Or get rid of your own Empty constant:

private string WriteFailedList(DeployResponse response, string prefix = "")
{
    ...
}

(I'd also advise you to use camelCase for your parameters and local variables - so errorItems rather than ErrorItems. Or just errors, in fact. I'd also use a foreach loop instead of calling ToList() and then using ForEach.)

people

See more on this question at Stackoverflow