agoge
@agoge

Почему метод GetEnumerator() интерфейса IEnumerable реализовывается дважды?

Добрый день.
Подскажите пожалуйста, пробую разобраться с примером из книги ASP.NET MVC 4 и в листинге Листинг 4-14 есть непонятный для меня момент.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace LanguageFeatures.Models
{
  public class ShoppingCart : IEnumerable<Product>
  {
    public List<Product> Products { get; set; }
    public IEnumerator<Product> GetEnumerator()
    {
      return Products.GetEnumerator();
    }
   IEnumerator IEnumerable.GetEnumerator()
    {
      return GetEnumerator();
    }
  }
}

Почему метод GetEnumerator() интерфейса IEnumerable реализовывается дважды?
Заранее огромное спасибо.
  • Вопрос задан
  • 2600 просмотров
Решения вопроса 1
FirstX
@FirstX
.net developer
Для ответа на этот вопрос надо окунуться в историю. А именно был момент, когда не было Generic-типизации и был только нетипизированный интерфейс перечисления IEnumerable. А потом с приходом новой версии .Net появились обобщения (это когда явно указывается тип <T>, в твоем случае тип данных <Product>).

Сигнатура этого интерфейса выглядит следующим образом:
public interface IEnumerable<out T> : IEnumerable

То есть для обратной совместимости, новый интерфейс наследует старый, а значит и метода нужно реализовать два: один, который возвращает старый нетипизированный вариант, и новый, более удобный типизированный вариант.

Для понимания: в старом варианте, когда ты обходил в цикле каждый элемент через foreach - тип элемента был object (все другие типы от него унаследованы). И на каждой итерации, чтобы получить свой тип Product и работать с ним - приходилось делать приведение типов.
В новом варианте, благодаря тому, что явно указан тип <Product> при обходе в цикле - ты сразу получаешь объект типа Product.

Рекомендую по этой теме почитать вообще изменения в .Net при переходах с версии на версию + почитать про Generic в дотнете.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы