const Vector4 colorBlack = new Vector4(0,0,0,1);//Vector4 is struct
public static void example(Vector4 color = colorBlack) //not ok
{
//do something
}
const int someInt = 0;
public static void exampleInt(int n = someInt) // ok
{
}
我想知道究竟是什么"编译时常数"是。从here开始说明
它只是意味着标记为const的成员的每个实例在编译期间都将被其值替换,而readonly成员将在运行时被解析。
所以我假设我的colorBlack是const,那么它将是编译时常量,但编译器会告诉我。 但它并没有抱怨" const int some int = 0;"是编译时常量。
为什么?
答案 0 :(得分:2)
请参阅Can I specify a default Color parameter in C# 4.0?
另外:Default arguments for structures
如Section 7.15中所述,constant-expression是一个可以在编译时完全评估的表达式。由于创建除字符串以外的引用类型的非空值的唯一方法是应用new运算符,并且因为常量表达式中不允许使用new运算符,所以引用类型的常量唯一可能的值除了字符串之外是空的。
换句话说,在编译时,您只能默认为:
由于你只能使用new,如果你使用的是默认参数,并且你不能用引用类型(struct)来做,并且因为你需要指定一些特定的参数,你只能选择它是传递null。
const Vector4 colorBlack = new Vector4(0,0,0,1); // Vector4 is struct
public static void example(Vector4? color = null) // ? makes it nullable
{
if (color == null)
color = colorBlack;
}