Nơi tốt nhất để điều tra này là C# language specification. Ví dụ, trong trường hợp của enumerables, sau đây là một số đoạn từ spec:
10.14.2 giao diện Enumerable
Các giao diện đếm được là những giao diện phi generic System.Collections. IEnumerable và tất cả instantiations của giao diện chung System.Collections.Generic.IEnumerable. Vì lợi ích ngắn gọn, trong chương này , các giao diện này là được tham chiếu là IEnumerable và IEnumerable, tương ứng.
...
10.14.5.1 Các GetEnumerator phương pháp
Một đối tượng đếm được cung cấp một thực hiện trong những phương pháp GetEnumerator của IEnumerable và giao diện IEnumerable. Hai phương pháp GetEnumerator chia sẻ một thực hiện phổ biến mà mua lại và trả về một điều tra có sẵn đối tượng. Đối tượng điều tra là được khởi tạo với các giá trị đối số và giá trị mẫu được lưu khi đối tượng được liệt kê là được liệt kê, nhưng nếu không thì đối tượng liệt kê chức năng như được mô tả trong §10.14.4.
này mối quan hệ độc đáo với cách các giao diện là thực định nghĩa trong .NET BCL, mặc dù nó sẽ là hoàn toàn có thể cho ra một khuôn khổ khác nhau (ví dụ non-.NET) để cung cấp một tương tự, thực hiện tương thích trình biên dịch C# sau đó có thể nhắm mục tiêu.
Các phần của thông số khó tách rời khỏi.NET framework thường được đánh dấu bằng:
Lưu ý: Phần này chỉ áp dụng cho việc triển khai Microsoft .NET của C#.
Ngày lưu ý khác, foreach
không thực sự đòi hỏi IEnumerable
; nó có thể sử dụng một loại 'gõ vịt', mà bạn có thể đọc trong phần 8.8.4 của spec.
Ah, do đó, nó thực sự là tất cả về * thực hiện * của ngôn ngữ, sau đó? – Smashery
@Smashery: Tôi nghĩ tốt hơn là nên nghĩ về nó trong việc thực hiện trình biên dịch * tuân thủ *. – Ani
Là một cú pháp sang một bên, LINQ * * không đặt bất kỳ yêu cầu cụ thể nào; giống như 'foreach', nó hoàn toàn dựa trên mẫu. Cây biểu hiện phụ thuộc nhiều hơn, nhưng các chi tiết của bản dịch này thực sự không có trong spec. –