INeedHelpPlease Ответов: 2

Как я могу исправить этот код, у меня есть только 13 ошибок, но все они CS0029. Я использую C# windows forms.net каркас


//read and convert first operand 
            operand1 = Convert.ToDouble(operand1TextBox.Text);
            //read and convert second operand
            operand2 = Convert.ToDouble(operand2TextBox.Text);
            //compute result
            answer = operand1 + operand2;
            //format result as string and display on form
            answerTextBox.Text = String.Format("{0:N3}", answer);
        }

        private void subtractButton_Click(object sender, EventArgs e)
        {
            //read and convert first operand 
            operand1 = Convert.ToDouble(operand1TextBox.Text);
            //read and convert second operand
            operand2 = Convert.ToDouble(operand2TextBox.Text);
            //compute result
            answer = operand1 - operand2;
            //format result as string and display on form
            answerTextBox.Text = String.Format("{0:N3}", answer);
        }

        private void multiplyButton_Click(object sender, EventArgs e)
        {
            //read and convert first operand 
            operand1 = Convert.ToDouble(operand1TextBox.Text);
            //read and convert second operand
            operand2 = Convert.ToDouble(operand2TextBox.Text);
            //compute result
            answer = operand1 * operand2;
            //format result as string and display on form
            answerTextBox.Text = String.Format("{0:N3}", answer);
        }

        private void divideButton_Click(object sender, EventArgs e)
        {

            //read and convert first operand 
            operand1 = Convert.ToDouble(operand1TextBox.Text);
            //read and convert second operand
            operand2 = Convert.ToDouble(operand2TextBox.Text);
            //compute result
            if (operand2 != 0)
            {
                answer = operand1 / operand2;
                //format result as string and display on form
                answerTextBox.Text = String.Format("{0:N3}", answer);
            }
            else
            {
                //display the error
                MessageBox.Show("Cannot divide by zero. Re-enter the denominator.", "Error in denominator", MessageBoxButtons.OK, MessageBoxIcon.Error);
                //set focus back to the textbox with the data entry error
                operand2TextBox.Focus();
                operand2TextBox.SelectAll();
            }
        }

        private void clearButton_Click(object sender, EventArgs e)
        {
            //Clear text Boxes
            operand1TextBox.Clear();
            operand2TextBox.Clear();
            answerTextBox.Clear();
            //reset the focus to the top TextBox
            operand1TextBox.Focus();
        }

        private void exitButton_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}


Что я уже пробовал:

Честно говоря, я не знаю, что делать.

Patrice T

И вы слишком слабы, чтобы показать нам точные сообщения об ошибках ?

Dave Kreskowiak

Вам придется предоставить сообщения об ошибках, чтобы получить какой-либо полезный ответ.

CS0029 означает "не может неявно преобразовать тип 'type' в 'type'"

Но мы понятия не имеем, какие линии он бросает, ни какие типы и переменные задействованы.

2 Ответов

Рейтинг:
2

OriginalGriff

В дополнение к комментариям Рика, я добавлю несколько вещей.
Во - первых, не используйте Convert для пользовательского ввода-все делают ошибки, и если ваше приложение в результате выходит из строя, это довольно грубо! Вместо этого используйте методы TryParse, так как они возвращают результат "OK / Failed", с которым вы можете работать.

Во-вторых, там много дублированного кода: ваши методы сложения, вычитания и умножения отличаются только одним символом!
Вместо того чтобы иметь отдельные методы для обработки операторов, используйте один, который определяет, что делать, основываясь на тексте кнопки:

private void OperatorButton_Click(object sender, EventArgs e)
    {
    double op1;
    if (!double.TryParse(operand1TextBox.Text, out op1))
        {
        MessageBox.Show($"\"{operand1TextBox.Text}\" is not a number");
        return;
        }
    double op2;
    if (!double.TryParse(operand2TextBox.Text, out op2))
        {
        MessageBox.Show($"\"{operand2TextBox.Text}\" is not a number");
        return;
        }

    double result;
    if (sender is Button b)
        {
        switch (b.Text)
            {
            default: MessageBox.Show($"Unknown button pressed: \"{b.Text}\""); return;
            case "+": result = op1 + op2; break;
            case "-": result = op1 - op2; break;
            case "*": result = op1 * op2; break;
            case "/":
                if (op2 == 0.0)
                    {
                    MessageBox.Show("Divide by zero is not possible");
                    operand2TextBox.Focus();
                    operand2TextBox.SelectAll();
                    return;
                    }
                result = op1 / op2;
                break;
            }
        answerTextBox.Text = String.Format("{0:N3}", result);
        }
    }
Таким образом, вам будет легче поддерживать весь ваш код в актуальном состоянии с последними изменениями, поскольку он должен быть изменен только в одном месте.

Вы также заметите, что я не добавил никаких комментариев к этому коду: это потому, что он на самом деле не нуждается в них - все ваши комментарии просто описывают то, что делает код, используя немного другие слова для самого кода:
//read and convert first operand
operand1 = Convert.ToDouble(operand1TextBox.Text);
//read and convert second operand
operand2 = Convert.ToDouble(operand2TextBox.Text);
//compute result
answer = operand1 - operand2;
//format result as string and display on form
answerTextBox.Text = String.Format("{0:N3}", answer);
Ни один из этих комментариев ничего не добавляет к сжатию кода - просто усложняет просмотр самого кода! Комментарии должны описывать почему? код делает что - то, а не то, что делает код-они добавляют информацию, а не дублируют ее. Если вы используете правильные соглашения об именах и избегаете "умного кода", все это должно быть самодокументировано, а это означает, что комментарии не устарели-когда вы меняете код, слишком легко забыть обновить "описательные комментарии", такие как ваш, и тогда они больше не отражают код вообще и хуже, чем бесполезны!


Рейтинг:
0

RickZeeland

Смотрите пример здесь: c# - сообщение об ошибке компилятора: CS0029: не удается неявно преобразовать тип 'int' в 'string' - переполнение стека[^]

Поэтому проверьте свои объявления переменных, например, проверьте, объявлен ли операнд 1 как double:

Public double operand1;

operand1 = Convert.ToDouble(operand1TextBox.Text);

Также видеть: C# | Типы Данных - GeeksforGeeks[^]