Вы получите проблему с индексом массива для любой строки, содержащей более десяти символов, так как вы перебираете все эти значения и используете этот индекс итерации для просмотра numCheck
также и массив. Так как в нем всего десять элементов, доступ к 11-му не запрещен.
Наивным подходом было бы иметь два вложенных цикла для проверки если какой-либо символ в numCheck
равен любому символу входной строки, что-то вроде (это может быть несколько оптимизировано, но я не стал беспокоиться, поскольку, как вы увидите ниже, это совершенно не нужно)
bool hasADigit = false;
for (int i = 0; i < txt_Pass.Text.Length; i++) {
for (int j = 0; j < numCheck.Length; j++) {
if (txt_Pass.Text[i] == numCheck[j]) {
hasADigit = true;
}
}
}
// hasADigit is true if it, well, has a digit :-)
Но, как уже говорилось, в действительности это не является необходимым, когда C# предоставляет все виды чудесных библиотечных функций для выполнения тяжелой работы за вас:
bool hasADigit = (txt_Pass.Text.indexOfAny(numCheck) != -1);
Таким образом, весь ваш кодовый блок можно уменьшить до:
char[] numCheck = {'0','1','2','3','4','5','6','7','8','9'};
lbl_Form1_NumError.Visible = (txt_Pass.Text.indexOfAny(numCheck) == -1);