【发布时间】:2013-09-11 12:05:22
【问题描述】:
更新:这似乎是一个编译器红鲱鱼,因为以下内容实际上是有效的:
const int MyInt = default(int);
问题在于DateTime 不是有效的const,而不是default 的使用。
让我感到困惑的主要原因是没有意识到 default(DateTime) 是在可选参数中专门处理的(我得出了一个错误的结论,即由于错误消息,default(DateTime) 被视为编译时常量省略其他可能的条件)。 MarcinJuraszek 在他的回答中解决了这个问题。
原问题:
这是从 this answer 的 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) {}
导致编译器以不同方式处理这些的幕后发生了什么?
【问题讨论】:
-
可选参数是事后添加的。
-
查看编译器消息。可能会告诉你一些事情。
-
@DanielA.White -
default, IIRC 也是如此。它仅在泛型存在时添加。 -
@usr 好吧,编译器消息是混淆伙伴的来源。
-
它似乎是规范的一部分。我真的应该在某个时候更彻底地阅读!
标签: c#