Я создаю простое приложение-калькулятор в WinUI с C#. Я использую метод Compute в DataTable для решения арифметической задачи. AnswerBox — это метка, к которой добавляются числа и операторы, а ответ отображается (с использованием функции вычисления) при нажатии кнопки.
AnswerBox.Text = (string)new DataTable().Compute(AnswerBox.Text, "");
Возникает исключение, когда я ввожу в метку 2+2 (или любое другое допустимое выражение). Исключение не отображается в vs2022, приложение аварийно завершает работу и открывает файл App.g.ics, отображающий следующее.
#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>
{
if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
};
#endif
Часто помогает добавление полученного вами исключения. Они не равны, вы знаете. Здесь результатом «2+2» является целое число, а не строка. Исключение должно вам об этом сказать.
Помимо всего прочего, я ожидаю, что исключение будет отображено в окне «Вывод», хотя, возможно, этого не произойдет, пока вы не продолжите с этого момента.
@jmcilhinney, я тоже этого ожидал, но когда я продолжаю, он говорит, что текущий отладчик не может обработать исключение. Что это значит?





В этом случае следующий код возвращает значение int, а именно 4.
new DataTable().Compute(AnswerBox.Text, "");
Проблема в том, что вы не можете просто привести int к string.
Следующий код должен работать:
var dataTable = new DataTable();
if (dataTable.Compute(AnswerBox.Text, "") is int coputeResult)
{
AnswerBox.Text = coputeResult.ToString();
}
Спасибо, @Andrew KeepCoding, я думал, что вычисления преобразуют результат int в строку, поэтому я использовал приведение строки. Я бы также добавил оператор else if для десятичных чисел (с плавающей запятой), поскольку мой калькулятор также имеет десятичные операции :)
Позже я придумал лучшее решение -
var result = new DataTable().Compute(AnswerBox.Text, "");
AnswerBox.Text = result.ToString();
Теперь он может обрабатывать как целые, так и десятичные числа (практически все, что угодно xD).
Посмотрите на аргумент
e, он будет содержать исключение, вызывающее сбой.