Il posto migliore per indagare questo è il C# language specification. Ad esempio, nel caso di enumerables, qui alcuni frammenti della spec:
10.14.2 interfacce enumerabili
Le interfacce sono enumerabili l'interfaccia non generico System.Collections. IEnumerable e tutte le istanze dell'interfaccia generica 01.Configurazione.Generico.Numerico. Per brevità, in questo capitolo queste interfacce sono riferimento come IEnumerable e IEnumerable, rispettivamente.
...
10.14.5.1 Il metodo GetEnumerator
Un oggetto enumerabile fornisce una attuazione dei GetEnumerator metodi della IEnumerable e IEnumerable. I due metodi GetEnumerator condividono un comune implementazione che acquisisce e restituisce un oggetto enumeratore disponibili. L'oggetto enumeratore è inizializzato con i valori dell'argomento e il valore dell'istanza salvato quando l'oggetto enumerabile è stato inizializzato, ma altrimenti l'oggetto enumeratore funziona come descritto in §10.14.4.
Questo si lega bene con come queste interfacce sono effettivamente definito nella NET BCL, anche se sarebbe completamente possibile per un diverso quadro (cioè non-.NET) per fornire un'implementazione compatibile simile che un compilatore C# potrebbe quindi targetizzare.
Parti delle specifiche difficili da separare dal.NET framework sono normalmente contrassegnati con:
Nota: questa sezione è applicabile solo all'implementazione Microsoft .NET di C#.
In un'altra nota, foreach
in realtà non richiedono IEnumerable
; può usare una sorta di 'digitazione anatra', che puoi leggere nella sezione 8.8.4 delle specifiche.
Ah, quindi è davvero tutto sulla * implementazione * della lingua, quindi? – Smashery
@Smashery: Penso che sia meglio pensarlo in termini di implementazione di un compilatore * compatibile *. – Ani
Come una parte, la sintassi LINQ * * non pone alcuna richiesta specifica neanche; come 'foreach', è interamente basato su pattern. Gli alberi delle espressioni sono più dipendenti, ma i dettagli di questa traduzione non sono in ogni caso nelle specifiche. –