如何在没有编译时常量的情况下设置可选参数

cil*_*ler 15 c# parameters optional

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

public string Download(Encoding contentEncoding = null) {
    defaultEncoding = contentEncoding ?? Encoding.UTF8;
    // codes...
}
Run Code Online (Sandbox Code Playgroud)

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

public string Download(Encoding contentEncoding = Encoding.UTF8) {
    // codes...
}
Run Code Online (Sandbox Code Playgroud)

不使用编译时常量?

Ode*_*ded 18

简而言之.没有.

可选参数需要是编译时常量或值类型.

从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...
}
Run Code Online (Sandbox Code Playgroud)

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


Moh*_*han 8

使用重载:

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

public string Download()
{
    return Download(Encoding.UTF8);
}
Run Code Online (Sandbox Code Playgroud)


Mir*_*mvs 5

public static string Download(Encoding encoder = null)
{
    if (encoder == null)
        encoder = Encoding.Default


   string returnVal="";
   // do something

    return returnVal;
}
Run Code Online (Sandbox Code Playgroud)