为什么我不能在初始化器中初始化只读变量?

26

为什么我不能在初始化器中初始化只读变量?以下代码并没有按照预期运行:

class Foo
{
    public readonly int bar;
}

new Foo { bar=0; }; // does not work

这是CLR的一些技术限制导致的吗?

编辑

我知道new Foo { bar=0; }new Foo().bar=0;是相同的,但是“只读”是由CLR强制执行的,还是仅仅是编译器的限制?


3
根据您的最新编辑,我不知道您在问什么。是的,“readonly”由CLR在运行时执行。我不明白它为什么会是编译器的限制。其他回答解释了为什么您尝试做的事情没有任何意义。 - Cody Gray
@Cody Gray -- 这是“语言限制”,而不是“编译器限制”。编译器只是实现语言的工具。 - user166390
@pst:嗯,我说“我不明白这怎么可能是编译器的限制。”我同意你的观点。 - Cody Gray
11个回答

-1

你的代码或假设并没有太大问题,除了可能初始化列表的一个重要特性是不强制顺序约束(尤其是对于C++而言)。分号是一个顺序运算符,因此初始化列表应该用逗号分隔。

除非你认为规范本身就是正确的,否则我认为这里语言规范是错误的。它在一定程度上破坏了语言中一个重要的特性,即只读属性。其他答案中提到的歧义问题在我看来有一个根本原因。只读属性是一个非常侵入式的特性,半路上进行const修正很难做到正确,更重要的是,会破坏已经形成的编码风格。

你正在寻找的,也许现在已经找到的是命名参数:https://dev59.com/fmDVa4cB1Zd3GeqPiv8s#21273185。虽然不是你所要求的,但已经接近了。

公平地说,我必须补充一点,有些非常有见识的作者完全不同意C++开发人员通常持有的关于const正确性的观点。埃里克·利珀特(Eric Lippert)承认他有一些精彩的帖子,他写道(对C++开发人员来说令人震惊的)声明:https://dev59.com/KXA75IYBdhLWcg3wf5NV#3266579


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接