为什么我不能在初始化器中初始化只读变量?以下代码并没有按照预期运行:
class Foo
{
public readonly int bar;
}
new Foo { bar=0; }; // does not work
这是CLR的一些技术限制导致的吗?
编辑
我知道new Foo { bar=0; }
和new Foo().bar=0;
是相同的,但是“只读”是由CLR强制执行的,还是仅仅是编译器的限制?
为什么我不能在初始化器中初始化只读变量?以下代码并没有按照预期运行:
class Foo
{
public readonly int bar;
}
new Foo { bar=0; }; // does not work
这是CLR的一些技术限制导致的吗?
编辑
我知道new Foo { bar=0; }
和new Foo().bar=0;
是相同的,但是“只读”是由CLR强制执行的,还是仅仅是编译器的限制?
你的代码或假设并没有太大问题,除了可能初始化列表的一个重要特性是不强制顺序约束(尤其是对于C++而言)。分号是一个顺序运算符,因此初始化列表应该用逗号分隔。
除非你认为规范本身就是正确的,否则我认为这里语言规范是错误的。它在一定程度上破坏了语言中一个重要的特性,即只读属性。其他答案中提到的歧义问题在我看来有一个根本原因。只读属性是一个非常侵入式的特性,半路上进行const修正很难做到正确,更重要的是,会破坏已经形成的编码风格。
你正在寻找的,也许现在已经找到的是命名参数:https://dev59.com/fmDVa4cB1Zd3GeqPiv8s#21273185。虽然不是你所要求的,但已经接近了。
公平地说,我必须补充一点,有些非常有见识的作者完全不同意C++开发人员通常持有的关于const正确性的观点。埃里克·利珀特(Eric Lippert)承认他有一些精彩的帖子,他写道(对C++开发人员来说令人震惊的)声明:https://dev59.com/KXA75IYBdhLWcg3wf5NV#3266579