2011-10-11 12 views
33

Tengo un problema muy simple. Hice una función muy simple para que usted demuestre mi problema.Uso del parámetro de salida no asignado, C#

// // principal

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; 
    } 
} 

// error

El uso de asignar a cabo parámetro 'NEWMAT' El parámetro out 'NEWMAT' debe ser asignado a antes de que el control abandona el método actual

No sé dónde está el problema.

+5

El mensaje de error es muy explícito. Por favor describe exactamente lo que no entiendes. –

+3

No veo ningún parámetro 'newMAt'. – BoltClock

Respuesta

70

Si la matriz se define fuera de la función, se debe utilizar un ref (o nada, teniendo en cuenta la matriz es un tipo de referencia). out significa que el parámetro se inicializará en la función antes de que regrese. Algunos ejemplos de uso:

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; 
    } 
} 

voy a añadir que si usted no sabe cuál es la diferencia entre ref y out se podía leer Difference between ref and out parameters in .NET

4

El mensaje de error es claro - es necesario asignar un valor al parámetro de tu internos de su método:

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

La asignación se realiza fuera el método no tiene ningún efecto. Sólo tiene que escribir esto:

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

No solo antes de la devolución, sino antes de la * lectura * de 'd' dentro del método. –

1

va a asignar valores a los elementos de su parámetro de matriz , pero hay que asignar y valor a la propia matriz porque su out define como:

d = new double[1, 4]; 
13

en C# hay dos palabras clave muy similares, y refout.

Ambos pasar valores por referencia, pero la diferencia es:

Cuando se utiliza el compilador ref le requerirá para asignar la variable antes de llamar al método.

Al usar out no será necesario. Esto significa que no podrá asumir que el parámetro ya se ha llenado. No podrá leer su valor dentro del método.

 

Para ilustrar el problema, sólo imaginar lo que sucedería si alguien escribió el código para llamar a su método:

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

Es evidente que nunca se le asignará la variable, lo cual es malo.

 

Esto le deja con tres opciones:

  1. asignar la variable cada vez se llama al método y utilizar void mynewMatrix(ref double[,] d)
  2. Asignar la variable de una vez, dentro de su método y utiliza void mynewMatrix(out double[,] d)
  3. Asigne la variable cada vez que llame al método y use void mynewMatrix(double[,] d)

La tercera opción funcionará porque hasta ahora no tiene que reasignar su variable. Obviamente, eso podría cambiar a medida que su código se vuelve más complicado. Supongo que tenía sus razones para usar out en primer lugar?

Cuestiones relacionadas