【问题标题】:C# difference between const int, const someStruct. Why is const someStruct not "compile-time constant"?C# const int、const someStruct 的区别。为什么 const someStruct 不是“编译时常量”?
【发布时间】:2014-04-20 15:21:25
【问题描述】:
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;”是编译时常量。

为什么?

【问题讨论】:

  • 编译器是怎么说的?
  • @deviantfan 'color' 的默认参数值必须是编译时常量
  • 编译器如何在编译时知道 colorBlack 的值?您需要运行 Vector4 构造函数才能找到它的值。
  • @DmitryDovgopoly 但不应该让“const”在编译时调用构造函数?这就是答案所说的“标记为 const 的成员将在编译期间被其值替换”然后我想我的阅读答案是错误的?
  • 编译器无法运行程序。代码只能在您启动程序时运行。您可以在 J.Richter 的 CLR via C# 中了解更多信息

标签: c# compile-time-constant


【解决方案1】:

Can I specify a default Color parameter in C# 4.0?

还有:Default arguments for structures

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

也就是说,在编译时,你只能默认为:

  • 文字字符串
  • new T() // 没有参数,或者等效地默认(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;
}

【讨论】:

  • 所以我不能有除本节中列出的值之外的值的常量表达式,字符串和空值。那么在变量 colorBlack 前面有 const 是什么意思呢?关键字应该使变量“const”,但从我读到的变量前面有“const”应该是不可能的?
  • @BlueBug 有两种方法可以创建常量字段。 constreadonly
  • @DmitryDovgopoly 我可以理解为,我可以创建常量字段,但它们不一定是“编译时间常量”吗? BUT 不会让变量在编译时被替换成值吗?
  • 如果您使用装箱,或者只是将您的结构转换为一个类,换句话说,使其可以为空,那么您可以使用 = null 作为默认值,然后检查该函数并分配它为黑色。
猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 2017-01-30
  • 2021-06-21
相关资源
最近更新 更多