给定
public class SomeClassWithAList
{
public List<int> list { get; set; }
}
[Fact]
public void InitListInsideModel()
{
var cashthing = new SomeClassWithAList { list = { 4 } };
}
我的问题是,它似乎InitListInsideModel
是一个有效的代码,但是此代码实际上无法执行。
System.NullReferenceException:对象引用未设置为对象的实例。
这里发生了什么?我不了解什么基本概念?这是编译器错误吗?为什么IntelliSense不会警告我无法以这种方式实例化列表?
TLDR
如您所知,此修复程序将以一种或另一种方式初始化集合
public List<int> list { get; set; } = new List<T>();
// or
var cashthing = new SomeClassWithAList
{
list = new List<int>(){ 4 }
};
至于为什么可以这样做却没有得到警告?好吧...这是一个有趣的问题。
乍一看,它看起来像一个roslyn错误,它允许在对象Initializer的集合上使用无效的数组初始值设定项语法。
但是,它实际上是设计使然。语法在做什么,就是使用collections方法的resolution添加一个序列。为此,需要初始化集合!Add
你每天学习新的东西
以下
var cashthing = new SomeClassWithAList
{
list = { 4 }
};
new SomeClassWithAList().list.Add(4);
IMO,静态分析应该对此有所警告(尤其是对于可为空的类型),还应该在对象和集合初始化器(C#编程指南)中对其进行详细记录。
我唯一可以找到合适文档的地方是C#语言规范
重点矿
7.6.10.2对象初始化程序
...
在等号后指定集合初始化程序的成员初始化程序是嵌入式集合的初始化。代替为字段或属性分配新的集合,将初始化器中给定的元素添加到由字段或属性引用的集合中。该字段或属性必须是满足§7.6.10.3中指定要求的集合类型。
因此,此功能的正确用法是确保您的集合已自动初始化
public List<int> list { get; set; } = new List<T>();
其他资源
深入研究之后,我发现了以下内容
GitHub问题谈论这种确切情况
GitHub问题想要增加文档的特异性以阐明语言功能
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句