问题标签 [collection-initializer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
959 浏览

c# - 列表属性的空集合初始化程序导致 null

当我运行这段代码时,它并没有ThisIsAList像我期望的那样初始化为一个空集合……而是ThisIsAList为空。

为什么这不是编译错误?为什么是结果null


我想知道这里是否进行了隐式转换,但以下尝试产生了编译错误:

根据关于集合初始化器的 MSDN 文档,听起来集合初始化器基本上只是Add()为您处理调用。所以我寻找可能的重载到List.Add,但没有找到任何我认为适用的东西。

有人可以从 C# 规范中解释这里发生了什么吗?

0 投票
0 回答
165 浏览

c# - EF7 是否支持集合初始化程序?

C# 6 为对象和集合的初始化方式引入了一些很酷的附加功能。

例如,此代码在 C#6 中有效:

所以现在可以为具有只读集合属性的对象编写初始化表达式。

有时我需要告诉 EF 如何组装实体:

这里Emails的属性需要是可写的。但是使用上面的代码,可以将其设为只读并像这样重写代码:

实际上,这可以通过引入具有匿名类型的 DTO 来完成,然后在客户端 ( AsEnumerable()) 上将其转换为所需的实体。尽管如此,我希望 EF7 本身支持该功能。

0 投票
2 回答
637 浏览

c# - 为什么允许我使用对象初始化器修改只读属性?

我有这个简单的代码:

所以当我创建一个数据类时:

该列表充满了字符串“1”、“2”、“3”、“4”,即使它没有set.

为什么会这样?

0 投票
1 回答
114 浏览

c# - 如何为 Matrix 类实现一个干净的自定义对象初始化器

我有一个自定义Matrix类,我想实现一个自定义对象初始化程序,类似于 double[,] 可以使用但似乎无法弄清楚如何实现它。

理想情况下,我希望它看起来像这样

截至目前,我有一个带有签名的常规构造函数

接受这样的电话

IEnumerable<double[]>和一个对象初始化器,它通过继承接口并实现公共 voidAdd(double[] doubleVector)方法来接受以下使用

当我尝试使用对象初始化器时,我想得到一个编译器错误,即没有重载,因为Add它需要 X 个参数,其中 X 是我要创建的列数(即在我提供的示例 3 中)。

如何设置我的班级以接受我提供的论点?

0 投票
2 回答
61 浏览

c# - 如何确定对象初始值设定项是否是调用 Add 方法的对象?

我有一个Vector可以通过多种方式初始化的自定义类。它具有以下构造函数来创建一个给定长度的全零向量。

IEnumerable或者它可以通过实现和这样的方法来使用对象初始化器Add(..)来填充给定的向量

问题在于你可以写如下代码

这看起来很无辜,但它最终创建了一个长度为 6 的向量,其中前三个值为 0,然后接下来的 3 个值为 1、2、5。理想情况下,这将只返回一个长度为 3 且值为 1、2、5 的向量。我已经完成并逐步完成了对象初始化,似乎没有任何迹象表明正在创建对象。看起来好像构造函数运行了,然后Add()调用了 3 个方法。如何判断它是调用该Add()方法的对象初始化程序并保护该方法不创建附加值?

ps 从评论部分可以看出,这个类的 API 在问题中并不好。仍在进行中的工作,但我很欣赏评论,因为它帮助我进一步提出了我的想法。我将问题保留原样,以便评论有意义。

0 投票
1 回答
208 浏览

c# - 集合初始化器的异步填充

我想使用将调用异步方法的集合初始化程序填充集合:

目的是让所有GetDiagnosticsInfoX()方法并行执行。我怀疑生成的代码会 GetDiagnosticsInfoX()同步调用方法——它会在调用第二个之前等待第一个调用。

我的直觉正确吗?

如果是这样,我假设我需要等待所有这样的任务:

0 投票
1 回答
260 浏览

c# - 在我自己的类上使用集合初始化程序

我正在尝试将集合初始化添加到我的班级。我在这里阅读了有关初始化程序的信息:https ://msdn.microsoft.com/en-us/library/bb384062.aspx#Anchor_2

我将引用令我困惑的重要部分:

集合初始值设定项允许您在初始化实现 IEnumerable 的集合类或具有Add扩展方法的类时指定一个或多个元素初始值设定项。

好的,所以我想强调or一词。当我阅读它时,我应该能够使用Add方法创建一个类,然后集合初始化程序应该在这个类上工作?情况似乎并非如此。我确实注意到的一件事是,它实际上说的是 Add 扩展方法。因此,我也尝试将 Add 创建为扩展方法,但无济于事。

这是我尝试过的一个小样本,但它不起作用:

报价是否受制于我以外的其他解释?我试图一遍又一遍地阅读它,看看我是否可以用其他方式解释它,但没有这样做。

所以我想我的问题是:我是否解释错了,我是否遗漏了什么,或者 MSDN 上对集合初始化程序的描述是否有错误?

0 投票
2 回答
146 浏览

c# - System.Array 不支持 Add(),那么集合初始化器是如何工作的呢?

在 C# 中,您可以像这样初始化一个数组:

正如Custom Collection Initializers中所引用的:

应用集合初始值设定项的集合对象必须是实现 System.Collections.IEnumerable 的类型,否则会发生编译时错误。对于按顺序指定的每个元素,集合初始值设定项在目标对象上调用Add 方法,并将元素初始值设定项的表达式列表作为参数列表,对每个调用应用正常的重载决议。因此,集合对象必须包含适用于每个元素初始值设定项的 Add 方法。

但是您不能添加到 System.Array,必须为每个添加的项目创建一个新的更大的数组,这对性能不利。那么在数组上使用集合初始化器时,C# 是如何工作的呢?我想知道我是否可以编写一个带有支持集合初始化程序的内部数组的类。

0 投票
1 回答
295 浏览

c# - 使用集合初始化器初始化 WebControl 对象的 Attributes 属性

我想WebControl内联初始化对象,但是对于某些字段,这有点棘手。例如,当我尝试像这样初始化对象的Attributes属性时TextBox

我得到错误:

无法使用集合初始化程序初始化类型“ AttributeCollection ”,因为它没有实现“System.Collections.IEnumerable”

知道在这种情况下内联初始化如何工作吗?

0 投票
1 回答
217 浏览

c# - 在一个类上初始化集合成员

我有一个具有集合属性的类:

现在我正在创建我的类的两个不同实例:

我知道编译器抱怨后者,因为该属性的设置器不存在(或者在这种情况下不可公开访问)。然而,第一个也是一个赋值 - 尽管是一个集合初始化器。

我假设集合初始化器被允许用于仅获取属性,因为它们只是调用Add而不IList实际调用属性的获取器。这是正确的吗?