为什么在速记成员初始化的当前上下文中不存在名称?

Tob*_*oby 9 c# object-initializers

我正在为对象使用对象初始st值设定项:

public class Container 
{
    public Container () { ContainedItem = new Item; }
    public Item ContainedItem { get; set; }
}

public class Item
{
    public string Value { get; set; }
}

var MyContainer = new Container()
{
    // I want to populate the the property Value of the property Item
    // with the second line rather than the first
    ContainedItem = new Item() { Value = FooString }, // This works
    ContainedItem.Value = FooString  // This assigns to the same member but does not work
};
Run Code Online (Sandbox Code Playgroud)

第二个初始化程序行给出错误:

当前上下文中不存在名称"ContainedItem".

初始化程序成员声明符无效.

并建议ContainedItem在本地范围内声明某处.

现在作为第一行工作,可以看出它ContainedItem实际上是一个有效的属性,Container并且MyContainer.ContainedItem绝对不是null ...那么为什么以下行无法识别呢?

Jon*_*eet 3

您可以按原样为“子属性”分配值,只是不使用该语法。这是一个完整的示例:

using System;

public class Container
{
    public Item Item { get; set; } = new Item();
}

public class Item
{
    public string Value { get; set; }
}

class Test
{
    static void Main(string[] args)
    {
        var container = new Container
        {
            Item = { Value = "hello" }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

中的对象初始值设定项Main相当于:

var tmp = new Container();
tmp.Item.Value = "hello";
var container = tmp;
Run Code Online (Sandbox Code Playgroud)

请注意,这依赖于Container.Item返回一个有效的对象,而没有在对象初始值设定项中显式初始化该对象 - 在我的示例中就是这种情况,但情况并非总是如此。