2012-07-31 30 views
19

Mientras se envía de vuelta parámetros conseguir este errorde error: El parámetro de salida debe ser asignado antes del control abandona el método actual

de error: El parámetro de salida debe ser asignado antes del control abandona el método actual

Código es

public void GetPapers(string web, out int Id1, out int Id2) 
    { 
     SqlConnection conn = new SqlConnection(ConnectionString()); 
     conn.Open(); 
     SqlCommand cmd = new SqlCommand("GetPapers", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.Add(new SqlParameter("@URL", String(web))); 

     SqlDataReader rdr = cmd.ExecuteReader(); 

     if (rdr.Read()) 
     { 
      Id1 = (int)rdr["ID1"]; 
      Id2 = (int)rdr["ID2"]; 
     } 

     rdr.Close(); 
    } 

que calificó como

GetPapers(web, out Id1, out Id2); 

relacionada a esta pregunta

Related question

+1

Parámetros que deben asignarse a lo largo de todos los caminos antes de que el control abandona el método de valor antes de regresar de los Getpapers(). Como tiene una instrucción if, es posible que no se asignen. –

+3

¿Qué desea que sean los valores si 'rdr.Read()' devuelve falso? –

+0

@JonSkeet código solo funciona cuando hay algo en DB, es como un receptor de eventos –

Respuesta

28

está asignando Id1 y Id2 dentro de una sentencia if y el compilador no puede determinar si se le asignará un valor en tiempo de ejecución, por lo tanto el error.

Puede asignarles un valor predeterminado antes de la instrucción if. Algo como.

Id1 = 0; 
Id2 = 0; 

if (rdr.Read()) 
{ 
    Id1 = (int)rdr["ID1"]; 
    Id2 = (int)rdr["ID2"]; 
} 

o especifique algunos valores predeterminados en else como parte de su condición.

Un parámetro de tipo out debe tener asignado algún valor antes de que el control abandone las funciones. En su caso, el compilador no puede determinar si sus variables serán asignadas o no, porque se está asignando dentro de una declaración if.

Ver: 5.3 Definite assignment

en un lugar determinado en el código ejecutable de un miembro de la función, se dice que una variable a ser definitivamente asignado si el compilador puede probar, mediante el análisis de flujo estático, que la variable ha sido iniciada automáticamente o ha sido el objetivo de al menos una asignación .

+0

Guau, esto parece muy roto, ¿por qué iban a hacer esta elección de diseño? – Harrichael

2

Debe inicializar esas variables;

que debe contener algún método

Cuestiones relacionadas