12

更新:这似乎是一个编译器红鲱鱼,因为以下内容实际上是有效的:

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) {}

幕后发生了什么导致编译器以不同的方式对待这些?

4

3 回答 3

7

这在 C# 规范 (10.6.1) 中有描述:

带有默认参数固定参数称为可选参数,而没有默认参数的固定参数是 必需参数。必需参数可能不会出现在正式参数列表中的可选参数之后。

一个reforout参数不能有一个default-argument默认参数中的表达式 必须是以下之一:

  • 一个常量表达式
  • 形式的表达式new S()whereS是一个值类型
  • 形式的表达式default(S)whereS是一个值类型

但你是对的,要求编译时常量的错误消息不好。

于 2013-09-11T12:13:13.877 回答
4

default()在运行时评估。DateTime.MinValue未声明为 const。

只有声明为 const 的符号才能用于成员初始化和属性声明。

可选参数是一种特殊情况。编译器为您生成重载。从语义上讲,它需要一个 const,但从技术上讲,默认值是可以的,因为编译器知道如何在生成的重载中使用它。

MSDN 声明可选参数接受default()new()设计http://msdn.microsoft.com/en-us/library/dd264739.aspx

关于 const 定义;

常量表达式是可以在编译时完全计算的表达式。

我同意这种区别很小,而且不止一次让我绊倒。

于 2013-09-11T12:07:57.620 回答
4

因为 aconst只能具有值default(TypeOfCost)可能会毫无用处:-)...而且您以后甚至无法更改它 :-)

请注意,这default(TypeOfConst) 一个常量表达式

从 C# 规范(5.0):7.19 Constant expressions... A constant-expression is an expression that can be fully evaluated at compile-time.... Only the following constructs are permitted in constant expressions:...• **Default value expressions**

错误是这const DateTime是非法的..

10.4 Constants...The type specified in a constant declaration must be sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, an enum-type, or a reference-type.

于 2013-09-11T12:08:31.560 回答