问题标签 [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 投票
2 回答
1180 浏览

c# - 初始化 lambda 表达式列表

我正在设计一个状态机类,并希望使用 lambda 表达式来表示满足状态转换对象的条件。当我创建一个新的状态转换对象时,我还想向它传递一个条件列表,它可以用来评估是否移动到下一个状态。但是,我在初始化条件列表时遇到问题。这是一个示例,简化的代码示例,说明了我遇到的问题:

我在说 的行上遇到花括号大括号的语法错误,在右括号上List<Condition>({) expected另一个语法错误

我确定我在这里遗漏了一些愚蠢的东西,但我已经盯着它太久了,似乎无法发现它。任何想法?

0 投票
2 回答
101 浏览

c# - 无法动态设置数组初始值设定项长度

我正在使用 C# 来连接 FedEx API,但我对如何修改一些现有代码以满足我的需求感到有些困惑。包含的代码片段是他们的预制代码的一部分,他们在其中对如何使用 1 种商品进行了示例。但是,当我的代码运行时,我将拥有 n 个商品……而且我不确定如何动态解决这个问题。

例如,如果我有 3 种商品,并且我手动添加 3new Commodity()条语句,它将正常工作。但是,这需要是动态的。

这是方法的开始,第一行是我需要帮助的地方。之后,我认为根据数组大小将其他所有内容放在一个循环中应该没问题。

如果我只是这样做,我会收到一个错误:

“预计长度为 3 的数组初始值设定项”

0 投票
1 回答
537 浏览

c# - 在 C# 6 索引初始值设定项中使用 C# 8 容错运算符

当使用索引初始化器填充字典而不在此之前重新创建它时,是否可以选择在某处指定容空运算符?

例子:

我知道这个用例(没有重新创建new Dictionary<string, string>索引初始化之前{ [...] = ... })可能不是很常见。但是我仍然想知道是否有解决方案可以防止上述情况出现此编译器警告:

[CS8602] 取消引用可能为空的引用。

我可以想象像这样使用 null-forgiving 运算符:

0 投票
1 回答
112 浏览

c# - 具有默认值的对象初始值设定项内的集合初始值设定项

我刚刚偶然发现了以下问题:

我理解为什么会发生这种情况: AllowedIds = { 1, 2 }不是赋值,而是对象初始值设定项中的集合初始值设定项,即,它是对AllowedIds.Add(1); AllowedIds.Add(2).

尽管如此,对我来说这是一个陷阱,因为它看起来像一个作业(因为它使用=)。

作为一名 API/库开发人员(假设我是开发Settings该类的人),想要坚持最小意外原则,能做些什么来防止我的库的使用者落入这个陷阱吗?


脚注:

  • 在那种特殊情况下,我可以使用 anISet/HashSet<int>而不是ICollection/List(因为重复对 没有意义AllowedIds),这将产生1, 2. 尽管如此,初始化AllowedIds = { 2 }会产生反直觉的结果1, 2

  • 我在C# github repo上找到了一个相关的讨论,基本上得出的结论是,是的,这种语法令人困惑,但它是一个旧功能(2006 年引入),我们无法在不破坏向后兼容性的情况下更改它。

0 投票
2 回答
77 浏览

c# - 为什么在对象初始化程序内部而不是外部允许没有`new`的集合初始化程序?

初始化集合属性时我注意到奇怪的行为。

考虑:

我可以这样初始化Ints

但我不能这样做:

任何想法为什么?这似乎很不直观。

0 投票
2 回答
50 浏览

c# - 使用 C# 中的对象初始化语法将内部对象的成员设置为外部对象

语境

  • 我有一个List<T>类型Question
  • ClassQuestion反过来又包含一个List<Answer>.
  • Answer有一个名为的成员public Question Question { get; set; },它存储答案所针对的问题。

我正在使用集合初始化语法将Question项目添加到列表中,并使用对象初始化来创建新的Question. 在这样做的同时,我还Answer使用对象初始化语法(嵌套)创建新对象。


问题

如何Question将内部类的成员设置Answer为引用封闭Question对象?Answer我知道创建an 的点,Question甚至没有完全初始化。但是有什么方法可以获取外部Question实例,以便我可以将其设置为内部实例Answer


代码

0 投票
1 回答
65 浏览

c# - 支持不可变集合的集合初始化语法 - 方法的初始化修饰符?

我需要实现一个支持集合初始化语法的不可变集合。问题是为了支持集合初始化语法,集合必须提供适当的公共 Add() 方法。但是,如果集合提供公共 Add() 方法,则它不再是不可变的。

我想要实现的示例:

为了使它工作,我需要 MyImmutableCollection 来实现 IEnumerable 并为 Add() 方法提供适当的签名(有关集合初始化的更多信息在这里):

但是,Add() 方法的存在打破了不变性。我想知道,是否有任何新的方法来实现这个目标?我在 StackOverflow 上看到了这个问题 -我可以使用大括号初始化 BCL 不可变集合吗?- 似乎在那一刻没有合适的解决方案,但这个问题已经很老了,希望 C# 中有一些新功能可用?我已经阅读了有关为不可变对象(此处)提供对象初始化的方法的 init 修饰符的介绍,但似乎该功能已恢复。我想也许有一些功能可以使 Add() 方法仅可用于初始化?

更新。我可能只是将构造函数添加到不可变集合中,例如 new MyImmutableCollection( /* items */ )。但是,使用构造函数可能涉及冗长的语法,尤其是当您需要为每个元素传递多个参数时。使用构造函数的示例:

集合初始化语法示例:

集合初始化语法更简洁,因此更可取。

这就是我们需要添加到类中以支持上面的构造和集合初始化语法:

0 投票
2 回答
1563 浏览

c# - 在 C# 中,对括号表达式的赋值是什么意思?

我正在阅读 Avalonia 源代码,我遇到了这句话:

我从未见过这样的语法。如果没有索引属性或 this[] 访问器,这些括号会做什么?如果它们所指的属性不是布尔值,为什么它们会用感叹号否定?也许是某种空检查?

代码本身包含在以下 cs 文件中:

https://github.com/AvaloniaUI/Avalonia/blob/master/src/Avalonia.Controls/Flyouts/MenuFlyout.cs

我已经跟踪了代码,但我无法理解该语法的作用。