为什么集合初始化抛出NullReferenceException

本文关键字:NullReferenceException 初始化 集合 为什么 | 更新日期: 2023-09-27 18:05:30

下面的代码抛出一个NullReferenceException:

internal class Foo
{
    public Collection<string> Items { get; set; } // or List<string>
}
class Program
{
    static void Main(string[] args)
    {
        new Foo()
            {
                Items = { "foo" } // throws NullReferenceException
            };
    }
}
  1. 为什么集合初始化器在这种情况下不工作,虽然Collection<string>实现了Add()方法,为什么是NullReferenceException被抛出?
  2. 是否有可能使集合初始化器工作,或者Items = new Collection<string>() { "foo" }是初始化它的唯一正确方法?

为什么集合初始化抛出NullReferenceException

谢谢大家。作为summary 集合初始化器不创建集合本身的实例,而只是使用Add()向存在的实例添加项,如果实例不存在则抛出NullReferenceException

1。

internal class Foo
{    
    internal Foo()
    {
        Items  = new Collection<string>();
    }
    public Collection<string> Items { get; private set; }
}
var foo = new Foo()
                {
                    Items = { "foo" } // foo.Items contains 1 element "foo"
                };

2。

   internal class Foo
    {    
        internal Foo()
        {
            Items  = new Collection<string>();
            Items.Add("foo1");
        }
        public Collection<string> Items { get; private set; }
    }
    var foo = new Foo()
                    {
                        Items = { "foo2" } // foo.Items contains 2 elements: "foo1", "foo2"
                    };

您从未实例化Items。试试这个。

new Foo()
    {
        Items = new Collection<string> { "foo" }
    };

要回答你的第二个问题:你需要在那里添加一个构造函数并初始化Items

internal class Foo
{    
    internal Foo()
    {
        Items  = new Collection<string>();
    }
    public Collection<string> Items { get; private set; }
}

为什么你的代码抛出NullReferenceException?

Foo构造函数中,您想初始化集合。

internal class Foo
{
    public Foo(){Items = new Collection(); }
    public Collection<string> Items { get; set; } // or List<string>
}
class Program
{
    static void Main(string[] args)
    {
        new Foo()
            {
                Items = { "foo" } // throws NullReferenceException
            };
    }
}

声明了Foo.Items,但是没有分配Collection的实例,所以.Itemsnull

修复:

internal class Foo
{
    public Collection<string> Items { get; set; } // or List<string>
}
class Program
{
    static void Main(string[] args)
    {
        new Foo()
            {
                Items = new Collection<string> { "foo" } // no longer throws NullReferenceException :-)
            };
    }
}