【问题标题】:How do array semantic initializers work in C#?数组语义初始化器如何在 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 成员。这是在幕后做的某种魔术吗?或者这与在类上定义的索引器有关吗?

谢谢。

【问题讨论】:

    标签: c# arrays list initialization semantics


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 2011-01-11
      • 2019-09-29
      • 2011-09-08
      相关资源
      最近更新 更多