为什么C#4.0中的可选参数需要编译时常量?

还有一种方法可以使用可选方法参数的运行时值吗?

可选参数必须是常量,因为它们是作为属性的值写出的。 因此,它们inheritance了属性值具有的所有限制。

无法直接编码运行时值。 但是,您可以使用以下模式关闭

public void MyApi(SomeType type = null) { type = type ?? new SomeType(); ... } 

可选参数被编译到程序集中,因此(就像指定为const任何东西一样)它们必须是编译时常量。

不,您不能将执行时值用作可选参数。

可选参数在编译时确定,如果调用参数太少的方法,则替换为方法。 它们通过在方法的IL中向参数添加属性来处理。

因此,它们需要在编译时完全解析(两者都用于创建,因为它们是属性,但也是在使用时)。 无法为可选方法参数使用运行时值。