C# проблема с параметром out в методе get root - PullRequest
0 голосов
/ 01 марта 2020

Этот код ниже захватывает 3 ввода с консоли, а затем анализирует числа, после чего отправляется методу getRealRoots. который находит, имеет ли он 2, 1 или нет корней. Выходные параметры в getrealroots показывают следующую ошибку:

Выходной параметр 'r1' должен быть назначен до того, как управление покинет текущий метод

Выходной параметр 'r2' должен быть назначенным до того, как управление покинет текущий метод

using System;

namespace Quadratic
{
    public class Program
    {
        static public void Main(string[] args)
        {

            Console.WriteLine("Enter three numbers, (A,B,C)");
            Double? a = GetDouble();
            Double? b = GetDouble();
            Double? c = GetDouble();

            getRealRoots(a, b, c,out r1,out r2);
            //throw new NotImplementedException("implement main");
        }





        static public int getRealRoots(double A, double B, double C, out double? r1, out double? r2)
        {
            double discriminant = B * B - 4 * A * C;

            if (discriminant > 0)
            {
                 r1 = (-B + Math.Sqrt(discriminant)) / (2 * A);
                 r2 = (-B - Math.Sqrt(discriminant)) / (2 * A);
                Console.WriteLine("The equation " + GetQuadraticString(A, B, C) + " has two real roots:" + r1 + " " + r2);
            }
            else if (discriminant == 0)
            {
                r1 = -B / (2 * A);
                Console.WriteLine("The equation " + GetQuadraticString(A, B, C) + " has one real root:" + r1);
            }
            else
            {
                Console.WriteLine("The equation " + GetQuadraticString(A, B, C) + " has no real roots:");
            }

        }

        //throw new NotImplementedException("write a method that uses out variables to return the real discriminants of a quadratic");

    }
}

error message that pops up

Ответы [ 2 ]

2 голосов
/ 01 марта 2020

Во-первых, у вас есть тип возвращаемого значения int, но вы не возвращаете int.

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

1004

Надеюсь, что смогу помочь

1 голос
/ 01 марта 2020

Как согласно документации для модификатора параметра out:

Переменные, передаваемые как аргументы out, не должны инициализироваться перед передачей в вызове метода. Однако вызываемый метод должен присвоить значение до его возврата.

В случае предоставленного вами кода в методе getRealRoots вы:

  • Установка выходного значения r1 и r2, где discriminant > 0
  • Установка выходного значения r1, где discriminant == 0, но не значение r2
  • Не задано r1 или r2, если не выполняется ни одно из вышеуказанных условий.

Поскольку вызываемый метод , требуется для назначения значение, вы должны установить значения r1 и r2 в каждом пути выполнения.

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

static public int getRealRoots(double A, double B, double C, out double? r1, out double? r2)
{
    r1 = null;
    r2 = null;

    // ... your method code
}

Значения по умолчанию затем перезаписываются в соответствии с заданными c ЕСЛИ заданными вами условиями.

...