System.StackOverflowException: "Exception_WasThrown" в GetEnumerator
Суть проблемы : При попытке использовать foreach на типозащищённом листе вылетает ошибка оверфлоу, я студент 1 курса учу язык только 3 месяца не бейте сильно могу тупить:( Не понимаю почему эта ошибка возникает, когда в другой программе всё нормально.
Зачем я использую форич? Я хочу вывести в messagebox список обьектов находящихся в листе(cart).
Вот типозащищённый лист:
public class Cart<T>:IEnumerable where T : IFood
{
private List<T> FoodStuffs = new List<T>();
public void Balance()
{
MessageBox.Show(Convert.ToString(FoodStuffs.Count));
}
public void Add(T item)
{
FoodStuffs.Add(item);
}
public IEnumerator GetEnumerator()
{
return GetEnumerator();
}
}
а вот основная часть программы(winform) в котором я использую foreach:
public partial class MainForm : Form
{
protected string lookcarzina;
public Cart<IFood> cart;
public MainForm()
{
InitializeComponent();
this.cart = new Cart<IFood>();
}
public MainForm(Cart<IFood> cart)
{
InitializeComponent();
this.cart = cart;
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void AddProduct_Click(object sender, EventArgs e)
{
AddProductForm addProductForm = new AddProductForm(cart);
this.Hide();
addProductForm.Show();
}
private void CartBalance_Click(object sender, EventArgs e)
{
cart.Balance();
}
private void CorzinaLook_Click(object sender, EventArgs e)
{
foreach (IFood t in cart)
{
lookcarzina += t.Name + Environment.NewLine;
}
MessageBox.Show(lookcarzina);
lookcarzina = "";
}
}
Ответы (1 шт):
public IEnumerator GetEnumerator()
{
return GetEnumerator();
}
Вот тут ошибка. GetEnumerator вызывает сам себя.
То есть foreach вызывает метод 'GetEnumerator', который вызывает сам себя и так бесконечно. Памяти не хватает и вылетает ошибка.
Тебе необходимо написать другую логику. Советую посмотреть официальную документацию по IEnumerable и IEnumerator или это:
https://metanit.com/sharp/tutorial/4.11.php
Сам я не пользовался IEnumerable, но наверное такое подойдёт (я хз):
public IEnumerator GetEnumerator()
{
return FoodStuffs.GetEnumerator();
}
То есть метод GetEnumerator обращается к закрытому (private) массиву 'FoodStuffs' и уже у него получает перечислитель ('FoodStuffs.GetEnumerator()').
