如果有效,下面的代码会非常酷。但是,我不能让它编译,所以我假设这不会以任何形式工作?
public void foo(char[] bar = new char[]{'a'})
{
}
下一个最佳选择就是
public void foo(char[] bar = null)
{
if (bar==null)
bar = new {'a'};
}
答案 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)
其他注释也适用,但也考虑到,因为默认值是在编译时插入调用者的,所以稍后更改默认值将不会更改调用者代码中的值(假设它是从另一个集会。)因此,你建议作为解决方法或次佳选项实际上是 更好的 实践