4

在 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 成员。这是在幕后做的某种魔术吗?或者这与在类上定义的索引器有关吗?

谢谢。

4

2 回答 2

9

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

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

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

于 2009-09-05T03:52:30.937 回答
2

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

于 2009-09-05T03:43:35.680 回答