数组语义初始化器如何在 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# 中工作?的主要内容,如果未能解决你的问题,请参考以下文章