2012-06-05 36 views
5

Tengo un método que devuelve un objeto y también tiene un parámetro out. El método llama a otro método que toma el mismo parámetro de salida que otro parámetro externo. Esto da un error de compilación en la instrucción de retorno:¿Cómo asignar el parámetro en la función?

El parámetro out 'param1' debe asignarse a antes de las hojas de control el método actual

El código es el siguiente:

public TypeA Method1(TypeA param1, out bool param2) 
{ 
    /... some logic here .../ 
    SubMethod(out param2); 
    /... some logic here .../ 
    return param1; 
} 

param2 se manipula en SubMethod(), no en Method1(). ¿Hay algo más que deba hacer?

+5

Ese código no concuerda con el mensaje de error. Trata de aislarlo con el código * just * con 'param1' (creo que' param2' es una pista falsa aquí). –

+0

Sí, eso es lo que creo también. –

+2

¿Cuál es la relación entre TypeA y TypeB? –

Respuesta

3

En este caso, voy a asignar un valor 'por defecto'. Independientemente de bool, int, myFoo, etc., establezca un valor predeterminado.

public TypeA Method1(TypeB param1, out bool param2) 
{ 
    param2 = false; // default value; 
    // or 
    param2 = default(bool); // in cases where you are not sure what the default is 

    /... some logic here .../ 
    SubMethod(out param2); 
    /... some logic here .../ 
    return param1; // UPDATE: <- this is where you are receiving the exception 
} 

pero hay que identificar por qué la excepción se refiere a 'param1' cuando param1 claramente no es la culpa en este ejemplo ( de aclaración: asumiendo TypeB : TypeA y se ve limitada correctamente).

Creo que al pasar param2 como un parámetro out en SubMethod(...) se elimina la obligación de asignar param2. Sin embargo, no ha asignado nada al param1. ¿Hay más cosas aquí que no hayan sido explicadas?

+1

Creo que lo clavaste en la cabeza. El problema es porque está devolviendo un TypeB cuando requiere TypeA. –

+1

Creo que solo asignar al principio es lo que me queda. Hay otras cosas pasando (condicionales) que podrían estar creando rutas de código para SubMethod(), que no se toman. – 4thSpace

+1

Como dije en el comentario a la pregunta, tenga cuidado de no asignar 'param2 = false;' a menos que acepte que 'Method1' podría regresar con' param2' establecido en ese valor. ¿Tiene sentido 'falso' como valor aceptable si 'SubMethod' nunca se golpea?Si el compilador puede ver que cada ruta del código pasa por la llamada 'SubMethod (out param2)', no será necesario primero establecer 'param2' en algún valor sin sentido. ('param2' se asigna definitivamente después de que 'SubMethod' regrese.) –

1

Puede establecerlo en false al comienzo de Method1.

+1

¿Qué tal una pequeña explicación? –

0

puedo sugerir mover el parámetro en Submethod para el tipo de retorno:

public TypeA Method1(TypeB param1, out bool param2) 
{ 
    /... some logic here .../ 
    param2 = SubMethod(param2); 
    /... some logic here .../ 
    return param1; 
} 
Cuestiones relacionadas