3
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
{

}

我想知道“编译时常量”到底是什么。从这里开始

这只是意味着标记为 const 的成员的每个实例都将在编译期间替换为其值,而 readonly 成员将在运行时解析。

所以我假设如果我的 colorBlack 为 const,那么它将是编译时常量,但编译器会告诉我不然。但它不会抱怨“const int some int = 0;” 是编译时常量。

为什么?

4

1 回答 1

2

请参阅我可以在 C# 4.0 中指定默认颜色参数吗?

另外:结构的默认参数

第 7.15 节所述,常量表达式是可以在编译时完全计算的表达式。由于创建除字符串之外的引用类型的非空值的唯一方法是应用 new 运算符,并且由于常量表达式中不允许使用 new 运算符,因此引用类型常量的唯一可能值字符串以外的为空。

换句话说,在编译时,你只能默认为:

  • 无效的
  • 文字字符串
  • new T() // 没有参数,或者等价的 default(T)

由于只有在使用默认参数时才能使用 new,并且不能使用引用类型(结构)来执行此操作,并且因为无论如何您都需要指定一些特定的参数,所以您唯一的选择是传递 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;
}
于 2014-03-15T06:01:07.603 回答