数组语义初始化器如何在 C# 中工作?

Posted

技术标签:

【中文标题】数组语义初始化器如何在 C# 中工作?【英文标题】:How do array semantic initializers work in C#? 【发布时间】:2010-11-25 19:49:01 【问题描述】:

在 C# 3 中,添加了初始化程序。这是一个很棒的功能。但是,有一件事让我感到困惑。

初始化类时,通常必须指定要初始化的成员变量或属性。例如:

class C  public int i; 

public void blah() 
    C c = new C()  i = 1 ;

我认为,数组语义从一开始就存在于 C# 中。但他们不会那样做。例如

public void foo()

    int[] i = new int[]  0, 1, 2, 3 ;

一切都很好,但是具有数组语义的类呢?

public void bar()

    List<int> li = new List<int>()  0, 1, 3, 3 ;

List 只是一个类,就像任何其他类一样(尽管它是一个泛型)。

我试图弄清楚编译器如何初始化 List 成员。这是在幕后做的某种魔术吗?或者这与在类上定义的索引器有关吗?

谢谢。

【问题讨论】:

【参考方案1】:

根据我有限的理解,List 使用了一种不同的语义,称为集合初始化器。这可能是造成差异的原因。

【讨论】:

你是对的。它是一个集合初始化器。这是 C# 3.0 的新功能msdn.microsoft.com/en-us/library/bb384062.aspx【参考方案2】:

C# 语言规范 v3.0 第 7.5.10.3 节集合初始化器:

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

要为您自己的集合启用此功能,您只需要有一个带有适当参数的Add 方法。编译器会将其转换为使用您指定的参数对Add 方法的一系列调用。

【讨论】:

以上是关于数组语义初始化器如何在 C# 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 memset 在苹果 clang 编译器中工作错误?

如何初始化自定义视图(控制器),以便它以编程方式和在 Interface Builder 中工作?

C#学习笔记—数组初始化

在MERN堆栈中工作时初始化Reducer时出错

如何在 C# 程序中工作?

Ckeditor 不能在 laravel 5.5 的 vue js 中工作