高级可选参数(c#)

时间:2011-03-22 12:57:40

标签: c# optional-parameters

如果有效,下面的代码会非常酷。但是,我不能让它编译,所以我假设这不会以任何形式工作?

public void foo(char[] bar = new char[]{'a'})
{
}

下一个最佳选择就是

public void foo(char[] bar = null)
{
   if (bar==null)
      bar = new {'a'};
}

5 个答案:

答案 0 :(得分:5)

不,这是不可能的。默认值需要是编译时常量。默认值将插入调用者,而不是被调用者。如果调用者无法访问用于创建默认值的方法,则代码将成为问题。

但你可以使用简单的重载:

public void foo(char[] bar)
{
}

public void foo()
{
  foo(new char[]{'a'});
}

答案 1 :(得分:1)

不,因为可选参数默认值必须是常量。

Why do optional parameters in C# 4.0 require compile-time constants?

答案 2 :(得分:1)

这将永远不会起作用,因为char []不是值类型,而是引用类型。只有值类型可以在可选参数中为它们分配常量。在编译时,您不能引用对象(例如数组)。 (Null是可选引用类型的唯一有效值。)

答案 3 :(得分:1)

仅使用值类型,您可以将参数的默认值设置为编译时常量(使其成为可选项)。对于引用类型,只有字符串具有该功能。其他类型只能设置为null。

编辑:感谢@Martinho Fernandes指出这一点。对于值类型,只允许编译时常量

答案 4 :(得分:1)

其他注释也适用,但也考虑到,因为默认值是在编译时插入调用者的,所以稍后更改默认值将不会更改调用者代码中的值(假设它是从另一个集会。)因此,你建议作为解决方法或次佳选项实际上是 更好的 实践