2013-08-28 8 views
2

Мой класс реализует IEnumerable. И эти два способа метода GetEnumerator код может быть скомпилирован:GetEnumerator: return or yield return

public IEnumerator GetEnumerator() 
{ 
    yield return Database[id].GetEnumerator(); 
} 

и

public IEnumerator GetEnumerator() 
{ 
    return Database[DatabaseId].GetEnumerator(); 
} 

где базы данных [ID] является список. Есть ли разница между этими реализациями?

ответ

6

Причина, по которой компилируется, заключается в том, что вы не понимаете, что такое перечислимое. Если вы сделаете это родовое становится все более очевидным:

public IEnumerator<Foo> GetEnumerator() 
{ 
    return Database[id].GetEnumerator(); 
} 

против

public IEnumerator<IEnumerator<Foo>> GetEnumerator() 
{ 
    yield return Database[id].GetEnumerator(); 
} 

Ваша версия yield return не приносит результата: он приносит итератор - это итератор-оф-итераторы , счетчик-перечислитель. И не в лучшую сторону. В принципе, «не делай этого».

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