C# 使用自动实现的Getter/Setter的List属性返回“对象引用未设置为对象的实例”

C# 使用自动实现的Getter/Setter的List属性返回“对象引用未设置为对象的实例”,c#,C#,为什么下面的C代码允许列表类型的自动实现属性会导致对象引用运行时错误?我意识到我可以实现getter并初始化列表,但我想知道这种行为背后是否有原因 class Program { static void Main(string[] args) { Foo foo = new Foo(); foo.FooList.Add(3); } } class Foo { public List<int> FooList { get

为什么下面的C代码允许列表类型的自动实现属性会导致对象引用运行时错误?我意识到我可以实现getter并初始化列表,但我想知道这种行为背后是否有原因

class Program
{
    static void Main(string[] args)
    {
        Foo foo = new Foo();
        foo.FooList.Add(3);
    }
}

class Foo
{
    public List<int> FooList { get; set; }
}

}

您需要在Foo对象的构造函数中初始化列表


它是一个属性,尚未实例化。您可以在类的构造函数或主方法中实例化它

或者使用C 6.0,您可以执行以下操作:


auto属性如何知道如何创建该类型的实例?因此,在我看来,需要注意的是:傻瓜=新列表;这是有道理的。除了不建议这样做的决定之外,我还会对这个属性做其他决定吗?如果您通过调用默认构造函数来初始化所有自动实现的属性,这可能会导致副作用。还有,你想如何分配空值?@TimSchmelter-有什么副作用?这就是我问题的实质。如果是空的,那么当您必须显式创建getter时,允许空赋值不是更好吗?@markm247:构造函数可能会非常昂贵。基本上它可以做任何事。谢谢你,大卫。这比对我实现getter更好,但我仍然想知道C不为我这样做是否有原因。没有回答这个问题行为背后的原因是什么?谢谢Habib。你对c6.0方法的评论正是我想要的,很高兴知道。
class Foo
{
    public List<int> FooList { get; set; }

    public Foo()
    {
        FooList  = new List<int>();
    }

}
class Foo
{
    public List<int> FooList { get; set; }

    public Foo()
    {
        FooList = new List<int>();
    }
}
static void Main(string[] args)
{
    Foo foo = new Foo();
    foo.FooList = new List<int>();
    foo.FooList.Add(3);
}
class Foo
{
    public List<int> FooList { get; set; } = new List<int>();

}