Мне кажется, что ваш SoldItems()
вариант 4 просто должен быть таким:
case 4:
return;
Вы уже вызываете SoldItems()
из DisplayMenu()
в MainMenu
, поэтому все, что вам нужно сделать, это вернуться к оператору переключения DisplayMenu()
и продолжить его цикл.
Наличие переменной Exit
здесь не нужно, поскольку return
оставляет все тело метода, завершая цикл while
. То же самое относится и к переменной DisplayMenu()
Exit
.
Полный код для SoldItems()
:
public void SoldItems()
{
do
{
DisplayInventory();
int userSelection = int.Parse(Console.ReadLine());
switch (userSelection)
{
case 1:
Money.MoneyAddition(goldPrice, 1);
Console.WriteLine(Money.userMoney);
break;
case 2:
Money.MoneyAddition(silverPrice, 1);
Console.WriteLine(Money.userMoney);
break;
case 3:
Money.MoneyAddition(titaniumPrice, 1);
Console.WriteLine(Money.userMoney);
break;
case 4:
return;
default:
Console.WriteLine("Invalid Input");
break;
}
}
while (true);
}
Объяснение StackoverflowException:
Это исключение возникает, когда стек заполняется. Представьте, что у вас есть три метода:
public void A() { B(); }
public void B() { C(); }
public void C() { }
Когда A вызывает B, в стек помещается дополнительный слой. То же самое происходит, когда B вызывает C. Когда C возвращается к B, этот уровень выталкивается из стека, а затем тот же самый, тогда B возвращается к A.
Стек .NET имеет конечный размер, поэтому вы не можете бесконечно вызывать методы. Это обычно достаточно для любого кода, который вы пишете, за исключением того, что рекурсивные функции могут быть немного опасными. Представьте себе этот код:
public void A() { A(); }
Он называет себя рекурсивно навсегда. Этот код обречен на исключение Stackoverflow. Когда вы пишете такой код, вам нужно наложить ограничение на него, чтобы он был настолько глубоким. Пример:
public void A(int maxDepth = 0) { if (maxDepth < 5) { A(++maxDepth); } }
Вы можете узнать больше о стеке и этом исключении здесь .
Обязательное гугл пасхальное яйцо