2015-12-20 11 views
6

Sto tentando di aggiungere l'inizializzazione della raccolta alla mia classe. Ho letto le inizializzatori qui: https://msdn.microsoft.com/en-us/library/bb384062.aspx#Anchor_2Utilizzo di inizializzatore di raccolta sulla mia classe

citerò la parte importante che mi lascia perplesso:

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, quindi voglio sottolineare sulla parola o. Mentre lo leggevo, dovrei essere in grado di creare una classe con un Aggiungi il metodo e quindi l'inizializzatore della raccolta dovrebbe funzionare su questa classe? Questo non sembra essere il caso. Una cosa che ho notato è che in realtà dice un metodo di estensione Aggiungi. Così ho provato a creare il metodo Aggiungi come estensione, ma senza risultato.

Ecco un piccolo campione ho provato che non funziona:

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

È la citazione soggetto ad altre interpretazioni del mio? Ho provato a leggerlo più e più volte, per vedere se potevo interpretarlo in altro modo, ma non ci sono riuscito.

Quindi credo che la mia domanda sia: sto interpretando male, mi manca qualcosa o c'è un errore nella descrizione degli inizializzatori di raccolta su MSDN?

+0

Cosa succede quando si crea un'istanza di 'PropertySpecificationCollection' e si inizializza la raccolta nel costruttore? –

+2

Sembra un errore nella documentazione, devi implementare 'IEnumerable' e deve esserci un metodo' Add' adatto. – Lee

+0

http://stackoverflow.com/questions/2495791/insegnalizzatori personalizzati- di raccolta – Mino

risposta

4

Deve essere "e", non "o".

initializers Collection sono descritti in C# language specification, sezione 7.6.10.3 inizializzatori Collection:

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.

Si afferma chiaramente che la raccolta deve implementare IEnumerablee ci deve essere un metodo Add. La chiamata al metodo Add viene risolta utilizzando il normale processo di risoluzione del sovraccarico, quindi può essere un metodo di estensione, metodo generico, ecc.

+0

Grazie. Puoi fornire un link alla sezione delle specifiche del linguaggio C# oltre alla citazione? – Inrego

+0

@Inrego È disponibile solo come .docx. Ho collegato il sito di download. –

+0

@Jakob grazie. Non c'è da stupirsi che non lo trovo nelle ricerche web. – Inrego

Problemi correlati