2015-12-20 9 views
6

Próbuję dodać inicjalizację kolekcji do mojej klasy. Czytałem o tutejszych inicjalizatorów: https://msdn.microsoft.com/en-us/library/bb384062.aspx#Anchor_2Używanie inicjalizatora kolekcji w mojej własnej klasie

Zacytuję ważny fragment, który mnie zagadką:

Collection initializers let you specify one or more element initializers when you initialize a collection class that implements IEnumerable or a class with an Add extension method.

OK, więc chcę podkreślić na słowie lub. Czytając go, powinienem móc stworzyć klasę z metodą Add, a następnie inicjator kolekcji powinien działać na tej klasie? Wydaje się, że tak nie jest. Jedną rzeczą, którą zauważyłem, było to, że w rzeczywistości mówi ona o metodzie Add extension. Więc spróbowałem stworzyć metodę Add as a extension, ale bez skutku.

Oto mała próbka Próbowałem że nie działa:

public class PropertySpecificationCollection 
{ 
    private List<PropertySpecification> _internalArr; 
    public void Add(PropertySpecification item) 
    { 
     _internalArr.Add(item); 
    } 
} 

Czy cytat z zastrzeżeniem innych interpretacji niż mój? Próbowałem go czytać wielokrotnie, aby zobaczyć, czy mogę to interpretować w jakikolwiek inny sposób, ale nie udało mi się tego zrobić.

Więc domyślam się, że moje pytanie brzmi: czy interpretuję to źle, czy brakuje mi czegoś, czy jest jakiś błąd w opisie inicjalizatorów kolekcji na MSDN?

+0

Co się stanie, gdy utworzysz instancję 'PropertySpecificationCollection' i zainicjujesz kolekcję w konstruktorze? –

+2

To wygląda na błąd w dokumentacji, musisz zaimplementować 'IEnumerable' i musi istnieć odpowiednia metoda' Add'. – Lee

+0

http://stackoverflow.com/questions/2495791/custom-collection-initializers – Mino

Odpowiedz

4

Powinno to być "i", a nie "lub".

inicjalizatory Collection są opisane w C# language specification, rozdział 7.6.10.3 inicjatorów Kolekcja:

The collection object to which a collection initializer is applied must be of a type that implements System.Collections.IEnumerable or a compile-time error occurs. For each specified element in order, the collection initializer invokes an Add method on the target object with the expression list of the element initializer as argument list, applying normal overload resolution for each invocation. Thus, the collection object must contain an applicable Add method for each element initializer.

To wyraźnie wskazuje, że zbieranie musi wdrożyć IEnumerablei musi istnieć metoda Add. Wywołanie metody Add jest rozwiązywane za pomocą normalnego procesu rozwiązywania przeciążenia, więc może to być metoda rozszerzenia, metoda ogólna itd.

+0

Dziękuję. Czy oprócz cytatu można podać link do sekcji specyfikacji języka C#? – Inrego

+0

@Inrego Jest dostępny tylko jako .docx. Połączyłem stronę pobierania. –

+0

@Jakob dziękuję. Nic dziwnego, że nie znajduję tego w wyszukiwarkach internetowych. – Inrego

Powiązane problemy