Подтвердить что ты не робот

Использование непризнанного параметра out, С#

У меня очень простая проблема. Я сделал очень простую функцию, чтобы продемонстрировать мою проблему.

//главная//

static void Main(string[] args)       
{
 double[,] mydouble = new double[1, 4];
 mynewMatrix(out mydouble);// call of method
}
public static void mynewMatrix(out double[,] d)
{
  for (int i = 0; i < 4; i++)
   {
    d[0,i]=i;
   }
}

//ошибка

Использование параметра непризнанного выхода 'newMAt' Параметр out 'newMAt' должен быть назначен до того, как управление покинет текущий метод

Я не знаю, где проблема.

4b9b3361

Ответ 1

Если массив определен OUTSIDE для функции, вы должны использовать ref (или ничего, учитывая, что массив является ссылочным типом). out означает, что параметр будет инициализирован в функции до ее возвращения. Некоторые примеры использования:

static void Main(string[] args)
{
    double[,] mydouble;
    mynewMatrix(out mydouble);// call of method

    double[,] mydouble2 = new double[1, 4];
    mynewMatrix2(mydouble2);// call of method

    // useless for what you want to do
    mynewMatrix3(ref mydouble2);// call of method
}

public static void mynewMatrix(out double[,] d)
{
    d = new double[1, 4];

    for (int i = 0; i < 4; i++)
    {
        d[0, i] = i;
    }
}

public static void mynewMatrix2(double[,] d)
{
    for (int i = 0; i < 4; i++)
    {
        d[0, i] = i;
    }
}

// useless for what you want to do
public static void mynewMatrix3(ref double[,] d)
{
    for (int i = 0; i < 4; i++)
    {
        d[0, i] = i;
    }
}

Я добавлю, что если вы не знаете, в чем разница между ref и out, вы можете прочитать Разницу между параметрами ref и out в .NET

Ответ 2

В С# есть два очень похожих слова, ref и out.

Оба передают значения по ссылке, но разница заключается в следующем:

Когда вы используете ref, компилятор потребует, чтобы вы назначили свою переменную до вызова метода.

При использовании out для этого не потребуется. Это означает, что вы не сможете предположить, что параметр уже заполнен. Вы не сможете прочитать его значение внутри метода.

 

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

double[,] myUnassignedDouble;
mynewMatrix(out myUnassignedDouble);

Ясно, что переменная никогда не будет назначена, что плохо.

 

Это дает вам три варианта:

  • Присвоить переменную каждый раз, когда вы вызываете метод, и использовать void mynewMatrix(ref double[,] d)
  • Назначьте переменную один раз, внутри своего метода и используйте void mynewMatrix(out double[,] d)
  • Присвоить переменную каждый раз, когда вы вызываете метод, и использовать void mynewMatrix(double[,] d)

Третий вариант будет работать, потому что пока вы не платите, чтобы переназначить свою переменную. Очевидно, что это может измениться по мере того, как ваш код становится более сложным. Я предполагаю, что у вас были причины использовать out в первую очередь?

Ответ 3

Сообщение об ошибке ясное - вам нужно назначить значение вашему параметру out внутри вашего метода:

public static void mynewMatrix(out double[,] d)
{
    d = new double[1, 4];
    for (int i = 0; i < 4; i++)
    {
        d[0,i]=i;
    }
}

Назначение, сделанное вне метода, не влияет. Просто напишите это:

static void Main(string[] args)       
{
    double[,] mydouble;
    mynewMatrix(out mydouble);
}

Ответ 4

Вы присваиваете значения элементам вашего параметра массива, но вам нужно назначить значение y самому массиву, потому что оно определено как out:

d =  new double[1, 4];