Кристофер достаточно хорошо ответил на вопрос, поэтому я не буду повторять его здесь.
Обходной путь для того, что вы пытаетесь сделать, может заключаться в реализации метода, который запрашивает у пользователя некоторый ввод и не возвращает, пока пользователь не введет строку, которая может быть преобразована в ожидаемый тип (инеобязательно соответствует некоторым другим условиям).
Например:
private static int GetIntFromUser(string prompt, Func<int, bool> validator = null)
{
int result;
var cursorTop = Console.CursorTop;
do
{
ClearSpecificLineAndWrite(cursorTop, prompt);
} while (!int.TryParse(Console.ReadLine(), out result) ||
!(validator?.Invoke(result) ?? true));
return result;
}
private static void ClearSpecificLineAndWrite(int cursorTop, string message)
{
Console.SetCursorPosition(0, cursorTop);
Console.Write(new string(' ', Console.WindowWidth));
Console.SetCursorPosition(0, cursorTop);
Console.Write(message);
}
Теперь мы можем вызывать этот метод в нашей основной программе и не беспокоиться о проверке - наш основной код намного чище.
Например, скажем, номер студента должен быть длиной 5 цифр, мы могли бы сделать что-то вроде:
int studentId = GetIntFromUser("Enter a 5-digit student id: ", x => x > 9999 && x < 100000);