更新:这似乎是编译器的误导,因为以下代码实际上是有效的:
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) {}
编译器在幕后进行了什么处理,导致它们被区别对待?
default
是在引入泛型时才添加的。 - Damien_The_UnbelieverDateTime
不是有效的常量,但 IDE 中的错误消息跳到了default
问题,这是一个误导。 - Adam Houldsworth