在对象初始化器的嵌入式集合上使用集合初始化器时,没有警告

值得

给定

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>();

其他资源

深入研究之后,我发现了以下内容

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

集合初始化器的异步填充

集合初始化器的怪异语法

C#中的集合和对象初始化器

在我自己的类上使用集合初始化器

初始化嵌入式结构时的指针差异

Kubeadm初始化警告-没有可用的验证器

动态使用对象初始化器

转发初始化器列表/集合初始化到std :: array成员

编译器会优化集合初始化吗?

C#集合初始化器foreach

使用集合初始化程序初始化WebControl对象的Attributes属性

为什么对象初始化和集合初始化的组合使用Add方法?

从集合初始化地图

初始化惰性集合

从现有集合初始化对象初始值设定项中的仅获取集合

为什么对字典使用隐式集合初始化器会导致C#中的运行时错误?

用于将项目添加到对象初始化器中的集合的语法糖

在Go中初始化嵌入式结构

无法初始化嵌入式结构

Spring Boot,无法初始化嵌入式tomcat

现有集合的C#集合初始化语法

Golang使用嵌入式模板初始化结构:结构初始化程序中的值太少

将集合初始化器与System.Data.DataTable.Rows一起使用

使用对象初始化器实例化类

无法延迟初始化角色集合:User.authorities,无法初始化代理-没有会话

无法修复无法延迟初始化角色集合的情况:无法初始化代理-没有会话

休眠:LazyInitializationException异常:未能初始化懒洋洋角色的集合。无法初始化代理 - 没有会话

如何修复Hibernate LazyInitializationException:无法延迟初始化角色集合,无法初始化代理-没有会话

Spring Data无法懒惰地初始化角色集合,无法初始化代理-没有会话