为什么集合初始化抛出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
};
}
}
- 为什么集合初始化器在这种情况下不工作,虽然
Collection<string>
实现了Add()
方法,为什么是NullReferenceException被抛出? - 是否有可能使集合初始化器工作,或者
Items = new Collection<string>() { "foo" }
是初始化它的唯一正确方法?
谢谢大家。作为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
的实例,所以.Items
是null
。
修复:
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 :-)
};
}
}