在我自己的类上使用集合初始化程序

7
我试图向我的类中添加集合初始化。我在这里阅读了有关初始化器的信息:https://msdn.microsoft.com/en-us/library/bb384062.aspx#Anchor_2 我引用了一个让我感到困惑的重要部分:
“当您初始化实现IEnumerable或具有Add扩展方法的类的集合类时,集合初始化程序允许您指定一个或多个元素初始化器。”
好的,我想强调一下这个词。按照我的理解,我应该能够创建一个具有Add方法的类,然后集合初始化器应该能够在这个类上工作?但事实并非如此。我注意到的一件事是,它确实说了一个Add扩展方法。所以我也尝试将Add创建为扩展方法,但没有成功。
这是我尝试过但不起作用的小样本:
public class PropertySpecificationCollection
{
    private List<PropertySpecification> _internalArr;
    public void Add(PropertySpecification item)
    {
        _internalArr.Add(item);
    }
}

这句话还有其他的解释吗?我试着反复阅读,看是否可以从其他角度来解释它,但是没有成功。

所以我的问题是:我解释错了吗?我漏掉了什么吗?还是MSDN上对集合初始化器的描述有误?


当您创建PropertySpecificationCollection的实例并在构造函数中初始化集合时会发生什么? - Maria Ines Parnisari
2
这似乎是文档中的错误,您必须实现 IEnumerable 并且必须有合适的 Add 方法。 - Lee
1
https://dev59.com/BnE95IYBdhLWcg3wCJNf - Panu Oksala
1
@miparnisari 我遇到了编译器错误:无法使用集合初始化程序初始化类型为“PropertySpecificationCollection”的对象,因为它没有实现“System.Collections.IEnumerable”。这证实了其他人所说的,它需要实现IEnumerable接口。 - Inrego
@Mino 在我提问之前,我确实查看了那个问题。但是,由于那里没有提供答案来源的链接——而且我正在查看 MSDN 的官方文档,发现了不同的内容——因此,我提出了这个问题,以确定哪一个是正确的,哪一个是错误的。 - Inrego
1个回答

5
应该是“and”,而不是“or”。 集合初始化器在C#语言规范第7.6.10.3节中有描述:

应用集合初始化器的集合对象必须是实现了System.Collections.IEnumerable接口的类型,否则将出现编译时错误。对于每个指定的元素,集合初始化器使用元素初始化程序的表达式列表作为参数列表,在目标对象上调用Add方法,并对每个调用应用正常的重载解析。因此,集合对象必须对于每个元素初始化程序都包含一个适用的Add方法。

明确表示集合必须实现IEnumerable并且需要有一个Add方法。对Add方法的调用使用正常的重载解析过程,因此它可以是扩展方法、泛型方法等。

谢谢。除了引用外,您能否提供C#语言规范部分的链接? - Inrego
@Inrego 它只以 .docx 的格式提供。我链接了下载站点。 - Jakub Lortz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接