Quali interfacce implementano tutti gli array in C#?




.net arrays (4)

Come nuovo programmatore .NET 3.5, ho iniziato a imparare LINQ e ho trovato qualcosa di piuttosto semplice che non avevo notato prima:

Il libro afferma che ogni array implementa IEnumerable<T> (ovviamente, altrimenti non potremmo usare LINQ per oggetti sugli array ...). Quando ho visto questo, ho pensato a me stesso che non ci avevo mai pensato, e mi sono chiesto cos'altro implementano tutti gli array - così ho esaminato System.Array usando il browser degli oggetti (poiché è la classe base per ogni array nel CLR) e, con mia sorpresa, non implementa IEnumerable<T> .

Quindi la mia domanda è: dov'è la definizione? Voglio dire, come posso dire esattamente quali interfacce implementano tutti gli array?


A partire da .NET 4.5, gli array implementano anche le interfacce System.Collections.Generic.IReadOnlyList<T> e System.Collections.Generic.IReadOnlyCollection<T> .

Pertanto, quando si utilizza .NET 4.5, l'elenco completo delle interfacce implementate dagli array diventa (ottenuto utilizzando il metodo presentato nella risposta di Hosam Aly ):

System.Collections.IList
System.Collections.ICollection
System.Collections.IEnumerable
System.Collections.IStructuralComparable
System.Collections.IStructuralEquatable
System.Collections.Generic.IList`1[System.Int32]
System.Collections.Generic.ICollection`1[System.Int32]
System.Collections.Generic.IEnumerable`1[System.Int32]
System.Collections.Generic.IReadOnlyList`1[System.Int32]
System.Collections.Generic.IReadOnlyCollection`1[System.Int32]

Stranamente, sembra che sia stato dimenticato di aggiornare la documentation per menzionare queste due interfacce.


Con attenzione sulle interfacce array, possono implementarle ma in realtà non lo fanno davvero ... Prendete un loon sul seguente codice:

            var x = new int[] { 1, 2, 3, 4, 5 };
        var y = x as IList<int>;
        Console.WriteLine("The IList:" + string.Join(",", y));
        try
        {
            y.RemoveAt(1);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        Console.WriteLine(string.Join(",", y));

Produce il seguente risultato: result

Quindi l'analisi funziona ma non tutto è supportato, è corretto dalla prospettiva di raccolta a lunghezza fissa, ma è del tutto sbagliato se si crede davvero che sia una lista. Ecco il principio di Liskov da SOLID :(.

Per testare rapidamente this aiuterà.


Ho trovato l'implementazione di IList<T>, ICollection<T>, IEnumerable<T> nella classe nidificata SZArrayHelper della matrice.

Ma devo avvertirti: là troverai molte più domande ...

La refferenza

Dopo di ciò ne ho solo uno - there_is_no_array;)


Puoi trovare la risposta alla tua domanda empiricamente utilizzando un piccolo snippet di codice:

foreach (var type in (new int[0]).GetType().GetInterfaces())
    Console.WriteLine(type);

L'esecuzione dello snippet sopra riportato comporterebbe l'output seguente (su .NET 4.0):

System.ICloneable
System.Collections.IList
System.Collections.ICollection
System.Collections.IEnumerable
System.Collections.IStructuralComparable
System.Collections.IStructuralEquatable
System.Collections.Generic.IList`1[System.Int32]
System.Collections.Generic.ICollection`1[System.Int32]
System.Collections.Generic.IEnumerable`1[System.Int32]

( `1 significa <T> )





interface-implementation