C# 对象初始值设定项上的此变量记录在哪里?

C# 对象初始值设定项上的此变量记录在哪里?,c#,object-initializers,C#,Object Initializers,我没有看到关于这一点的任何解释。具体地说,我注意到可以使用对象初始值设定项来设置子类型的属性,而不是更新子类型本身 语法本身与我对MSDN页面的理解不符。我知道我可以使用对象初始值设定项来设置初始化对象的字段,但我不知道在哪里可以设置字段的字段 我觉得这是合法的。人们可以用bt.subType.subtyvalue=5完成同样的事情 class BasicSubType { public int subTypeValue; } class BasicType { public

我没有看到关于这一点的任何解释。具体地说,我注意到可以使用对象初始值设定项来设置子类型的属性,而不是更新子类型本身

语法本身与我对MSDN页面的理解不符。我知道我可以使用对象初始值设定项来设置初始化对象的字段,但我不知道在哪里可以设置字段的字段

我觉得这是合法的。人们可以用
bt.subType.subtyvalue=5完成同样的事情

class BasicSubType
{
    public int subTypeValue;
}

class BasicType
{
    public BasicSubType subType {get;private set;}
    public BasicType()
    {
        subType = new BasicSubType();
    }
}

void Main()
{
    BasicType bt = new BasicType{subType={subTypeValue=5}};
}

我不确定您在用户文档中的何处可以找到它,但在关于对象初始值设定项的一节中的语言规范中有专门介绍:

在等号后指定对象初始值设定项的成员初始值设定项是嵌套对象初始值设定项,即嵌入式对象的初始化。嵌套对象初始值设定项中的指定将被视为对字段或属性成员的指定,而不是为字段或属性指定新值。嵌套对象初始值设定项不能应用于值类型的属性或值类型的只读字段


此文本也是。

的一部分,但在子类型上有专用setter。它不是必须阻止您访问设置值吗?@OleksiiAza,如果它的意思是
BasicType\uuuu编译器\u生成的\u变量=new BasicType()__编译器\u生成的\u变量.subType.subType值=5;BasicType bt=\uuuu编译器\u生成的\u变量
,它只使用
子类型的getter,而不是setter。@hvd不知道这一点,谢谢您的澄清。
子类型={SubtyValue=5}
设置
子类型。SubtyValue
而不是设置子类型,这是非常违反直觉的。通常人们希望
foo=bar
设置foo。在中,这在7.6.10.2中。有些C#功能只记录在技术文档中,而没有记录在面向用户的文档中,这有点令人失望。@Brian同意,但不管它值多少钱,用户文档和规范中也有很多功能缺失,因此,我认为记录在案的特性是一件好事。