2016-10-28 63 views
1

我不喜欢标题,methinks。但是忍耐我:我知道为什么引用类型本身不能被声明为const - 它们在编译时必须是完全可评估的。因此,引用类型常量的唯一可能值是字符串和空引用。为什么DateTime的声明会给出编译器错误而不是可选参数?

所以它是有道理的,const DateTime x = some date是无效的。但是遵循这个逻辑,我不应该把例如DateTime d1 = default(DateTime)作为一个可选参数传递,就像我不能声明const DateTime d1 = default(DateTime)一样,因为可选参数必须是编译时常量?这一直是我对“meh,只是它的方式”的态度,但我现在很好奇。

编译时常量不是编译时常量吗?如在,常数是一个常数?

当然,这或许也同样是我的IDE(Visual Studio中)只是给出了一个错误,因为日期时间不允许作为const,它会一直为default(DateTime)null参考编译罚款?

回答

1

查看关于optional parameters的msdn文章。 当数据类型是值类型(枚举,结构),你可以发起一个可选的参数有一个空的构造:

static void Foo(string s, DateTime opt = new DateTime()) 

还是用默认的关键字。这对于参考类型不适用。

+0

显然这个问题还不清楚 - 我知道。我问的是什么(我认为这是明显的措词“不是一个编译时常量编译时常量?因为,常量是一个常量?”)是_why_例如默认(日期时间)'可以作为可选参数(必须是编译时常量),但不能声明为编译时常量('const')。两者都是编译时常量,在我看来,应该在可选参数(编译时常量)和常量中没有区别。但很显然,因为一个错误而另一个错误。 –

+1

当涉及引用类型时,可选参数必须是仅编译时间常量** **。 'default(DateTime)'不是一个编译时间常量,所以你不能用它初始化一个const变量,但由于'DateTime'是一个值类型,你可以使用一个空构造函数或者default关键字来启动一个可选参数。 –

+0

啊,这是VS,这是棘手的,说“默认参数值为'富'必须是一个编译时常量”。这就是令人困惑的原因,以及为什么MSDN文章没有使它更清晰。没有意识到可选参数可能不是编译时常量。你懂得越多!谢谢! –

相关问题