IEnumerable <T> предоставляет два метода GetEnumerator - каково различие между ними?

Flexbox может сделать это.

.card {
display:flex;
flex-direction:column;
}

.button {
margin-top:auto;
}

.card {
  width:33%;
  margin:auto;
  display: flex;
  flex-direction: column;
  height:90vh;
  border:1px solid red;
 
}

.button {
  margin-top: auto;
}
<div class="card">
  <h2>Title</h2>
  <h3>Name</h3>
  <p>Lorem ipsum dolor, sit amet consectetur adipisicing elit. Molestiae, voluptatum?</p>
  <button class="button">button</button>
</div>

9
задан Roger Lipscombe 30 September 2009 в 13:18
поделиться

5 ответов

Если Вы реализуете IEnumerable<T> универсальный интерфейс, необходимо будет в значительной степени всегда использовать универсальный метод GetEnumerator - если Вы не бросаете свой объект явно к (неуниверсальному) IEnumerable.

Причиной является назад совместимость с.NET 1.0/1.1, который не поддерживал дженериков.

8
ответ дан 4 December 2019 в 05:56
поделиться

Причиной там являются два метода, то, потому что IEnumerable<T> наследовался IEnumerable взаимодействуйте через интерфейс, таким образом, Вы видите общий метод от IEnumerable<T> и необщий метод от IEnumerable.

Вот то, как Вы хотите реализовать интерфейс в своем типе:

class Foo : IEnumerable<Foo>
{
    public IEnumerator<Foo> GetEnumerator()   
    {
        // do your thing here
    }

    // do a EIMI here and simply call the generic method
    IEnumerator IEnumerable.GetEnumerator()
    {
        this.GetEnumerator();
    }
}
12
ответ дан 4 December 2019 в 05:56
поделиться

Вы обычно реализуете обоих. Каждый - более новая, универсальная версия, которая возвращает безопасный с точки зрения типов перечислитель (IEnumerator<T>). Другой - для совместимости с Унаследованным кодом (возвраты IEnumerator). Типичная реализация:

public IEnumerator<T> GetEnumerator() {
    foreach(T item in items) {
        yield return item;
    }
}

IEnumerator IEnumerable.GetEnumerator() {
    return GetEnumerator();
}
33
ответ дан 4 December 2019 в 05:56
поделиться

Обычно GetEnumerator() вызовы GetEnumerator<T>(), таким образом, не должно быть большого различия в поведении. Что касается того, почему существует два метода, это сделано для назад совместимости и для использования в ситуации где T не очень интересно (или просто неизвестно).

4
ответ дан 4 December 2019 в 05:56
поделиться

Тот универсален, другой один нет. Я полагаю, что компилятор предпочитает использовать универсальную перегрузку.

2
ответ дан 4 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: