2016-03-16 1 views
2

я написать общий класс, которые реализуют IEnumerable<T>:Почему я не получаю ошибку компилятора в изменении типа foreach над IEnumeable <T>?

public class EnumerableObject<T> : IEnumerable<T> 
{ 
    IEnumerator<T> IEnumerable<T>.GetEnumerator() 
    { 
     ... 
    } 

    public IEnumerator GetEnumerator() 
    { 
     ... 
    } 
} 

Таким образом, я могу итерацию над объектом этого класса с foreach, но если я изменить тип Еогеасп переменной, компилятор не дает мне ошибку и я могу написать этот код без ошибок компилятора:

foreach (string item in new EnumerableObject<int>()) 
{ 
    .... 
} 

Но если я перебирать общий список я получил ошибку компилятора:

foreach (string item in new List<int>()) 
{ 
    ... 
} 

Cannot convert type 'int' to 'string'

Я думаю List<T> Состояние класса похоже на мой класс EnumerableObject, но почему я не получаю ошибку компилятора в моем случае?

+4

Вы пытаетесь выполнить итерацию строки с помощью строки. Это никогда не сработает. Почему вы используете строку? – CathalMF

+0

@CathalMF, Если я полностью прочитал вопрос, я попытаюсь смоделировать конфликтную ситуацию, чтобы уточнить вопрос. –

ответ

8

Что происходит, так как ваш не общий метод GetEnumerator равен public, то он неявно используется как оператор foreach. Таким образом, он эффективно возвращает не общий код IEnumerator, позволяющий писать foreach (string item in new EnumerableObject<int>()), который будет взрываться во время выполнения.

Если вы сделаете не общий метод GetEnumerator частным, вы увидите предупреждение о времени компиляции. Вы должны делать это наоборот:

public class EnumerableObject<T> : IEnumerable<T> 
{ 
    public IEnumerator<T> GetEnumerator() 
    { 
     // Implement. 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
+1

Вы правы ... Теперь вы должны показать ему «более правильный код» с помощью swapperd 'GetEnumerator()': 'public IEnumerator GetEnumerator()' и 'IEnumerator IEnumerable.GetEnumerator()' – xanatos

+1

@xanatos Конечно, Я собирался это сделать :) –

 Смежные вопросы

  • Нет связанных вопросов^_^