如何在对象初始值设定项中分配只读成员变量?

6 c# c#-4.0

class foo {
    public readonly int bar;
};
foo a = new foo() { bar = 123 };
Run Code Online (Sandbox Code Playgroud)

error CS0191: A readonly field cannot be assigned to (except in a constructor or a variable initializer)

如何bar在上面的对象初始化程序中指定?

我可以初始化readonly成员而无需为每个类/结构编写自定义构造函数吗?

dtb*_*dtb 7

foo a = new foo() { bar = 123 };
Run Code Online (Sandbox Code Playgroud)

由编译器转换为

foo temp = new foo();
temp.bar = 123;
foo a = temp;
Run Code Online (Sandbox Code Playgroud)

如您所见,赋值bar既不在foo构造函数中也不在变量初始值函数中.

所以答案是:你做不到.

  • @scibuff 在语言设计方面,我认为 C# 结构被认为只是在不可变的形式(http://stackoverflow.com/questions/441309/why-are-mutable-structs- evil),但语言的变量初始化器实现不适用于此。因此,结构变量初始值设定项存在于语言中,但由于 CLI 而不是 Good Part™。 (2认同)

Sli*_*son 5

总结其他答案:错误消息没有帮助-对象初始化程序不能与只读字段一起使用。

但是,具有命名实参的构造函数可以,并且这样做的语法非常相似。  如此类似,您甚至可能以为您实际看到的是只读字段的C#对象初始化程序(就像我以前看到的那样):

class Foo {
    public Foo(int bar) {
        this.bar = bar;
    }
    public readonly int bar;
};

Foo a = new Foo(bar: 123);
// instead of `new Foo() { bar = 123 };`
Run Code Online (Sandbox Code Playgroud)