C#与const int,const someStruct之间的区别。为什么const someStruct不是"编译时常量"?

时间:2014-03-15 05:58:19

标签: c# compile-time-constant

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;"是编译时常量。

为什么?

1 个答案:

答案 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 T()//没有参数,或等效默认(T)

由于你只能使用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;
}