c#中const int与const someStruct的区别.为什么const someStruct不是“编译时常量

本文关键字:const someStruct 编译 常量 编译时常量 不是 区别 int 为什么 | 更新日期: 2023-09-27 17:50:18

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的成员的每个实例将在编译期间被其值替换,而只读成员将在运行时解析。

所以我假设如果我的colorBlack是const,那么它将是编译时常数,但编译器告诉我不是这样的。但它没有抱怨"const int some int = 0;"是编译时常量。

为什么?

c#中const int与const someStruct的区别.为什么const someStruct不是“编译时常量

参见我可以在c# 4.0中指定默认颜色参数吗?

也是:结构体的默认参数

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

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

  • 字面值字符串
  • new T()//没有参数,或者等效的default(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;
}