19

有没有办法写下面的C#方法:

public string Download(Encoding contentEncoding = null) {
    defaultEncoding = contentEncoding ?? Encoding.UTF8;
    // codes...
}

添加了默认参数,因此它看起来像这样:

public string Download(Encoding contentEncoding = Encoding.UTF8) {
    // codes...
}

不使用编译时常量?

4

3 回答 3

24

简而言之。不。

可选参数必须是编译时常量或值类型。

来自MSDN 上的命名和可选参数(C# 编程指南)

每个可选参数都有一个默认值作为其定义的一部分。如果没有为该参数发送任何参数,则使用默认值。默认值必须是以下表达式类型之一:

  • 一个常量表达式;
  • 形式的表达式new ValType(),其中ValType是值类型,例如枚举或结构;
  • 形式的表达式default(ValType),其中ValType是值类型。

您似乎想要实现的目标可以通过重载来实现:

public string Download()
{
   return Download(Encoding.UTF8);
}

public string Download(Encoding contentEncoding)
{
   defaultEncoding = contentEncoding ?? Encoding.UTF8;
   // codes...
}

请注意,这与可选参数并不完全相同,因为默认值会通过可选参数硬编码到调用者中(这就是存在限制的原因)。

于 2013-02-09T15:10:01.973 回答
10

使用重载:

public string Download(Encoding contentEncoding)
{
   // codes...
}

public string Download()
{
    return Download(Encoding.UTF8);
}
于 2013-02-09T15:11:10.473 回答
5
public static string Download(Encoding encoder = null)
{
    if (encoder == null)
        encoder = Encoding.Default


   string returnVal="";
   // do something

    return returnVal;
}
于 2014-11-27T10:06:48.163 回答