更新:这似乎是一个编译器红鲱鱼,因为以下内容实际上是有效的:
const int MyInt = default(int);
问题在于DateTime
不是有效的const
,而不是使用default
.
对我来说,困惑的主要来源是没有意识到这default(DateTime)
是在可选参数中专门处理的(我得出了一个错误的结论,default(DateTime)
由于错误消息省略了其他可能的条件,因此被视为编译时常量)。MarcinJuraszek 在他的回答中解决了这个问题。
原始问题:
这是从 Marc Gravell对另一个问题的答案的评论中无耻地撕下的。
为什么以下有效:
// No compiler errors, default(DateTime) seems to satisfy the compile-time constant requirement.
public static void DoSomething(DateTime date = default(DateTime))
{
}
但以下不是:
// Compiler error: "Constant initializer must be compile-time constant.
const DateTime MyDate = default(DateTime);
由于两者似乎都想要“编译时常量”(显然,如果您尝试为DateTime.MinValue
可选参数提供类似的东西,编译器会抱怨它不是编译时常量):
// Compiler error: Default parameter value for 'date' must be a compile-time constant.
public static void DoSomething(DateTime date = DateTime.MinValue) {}
幕后发生了什么导致编译器以不同的方式对待这些?