Я только начал с C # неделю назад (программирование на C ++ около 2 1/2 лет), и сегодня я запустил свое первое приложение формы. Это просто простой калькулятор.
Итак, у меня есть форма с кнопками 0-9; + ;- ;*;/ (и еще несколько, но они не интересны для этой задачи) и одно многострочное текстовое поле. Если пользователь нажимает кнопку, определенный символ или цифра записывается непосредственно в выходное текстовое поле. Таким образом, входная часть работает нормально.
Проблема в расчетной части. Код этой части:
DataTable dt = new DataTable();
double result = (double)dt.Compute(output.Text.ToString(), "");
output.AppendText($" ={result.ToString()}");
Если я запускаю его, я получаю эту ошибку:
*System.InvalidCastException
HResult=0x80004002
Message=Specified cast is not valid.
Source=SimpleCalculator
StackTrace:
at SimpleCalculator.Form1.result_Click(Object sender, EventArgs e) in C:\Users\Max\Documents\C#\Projects\SimpleCalculator\SimpleCalculator\Form1.cs:line 105
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at SimpleCalculator.Program.Main() in*
Итак, интересно, что я изменил его на int 32 (о чем говорится в сообщении об ошибке)
double result = (int32)dt.Compute(output.Text.ToString(), "");
он отлично работает до двойных значений, затем он работает с ошибкой (что такое логика), но если я верну его обратно, чтобы удвоить его работу.
double result = (double)dt.Compute(output.Text.ToString(), "");
Я немного смущен этим, потому что я ничего не менял в коде, и ошибка иногда возвращается.
Я имею в виду, да, это работает, но недостаточно чисто для меня. Я хочу иметь код без каких-либо шансов на ошибку.
Я использую сообщество Visual Studio 2017, это из-за VB или из-за плохого кода?
double
? Если вычисление иногда возвращает целые числа, а иногда удваивается, используйтеdouble
, потому что это работает для обоих.1+1=2
возвращаетint
, а1/1=1.0
возвращаетdouble
- person Tim Schmelter   schedule 08.10.2018double
, потому что он обрабатывает все вычисления. - person Tim Schmelter   schedule 08.10.2018