2012-07-31 3 views
19

Während Parameter zurückschicken diesen FehlerFehler: Die Out-Parameter muss, bevor die Steuerung zugeordnet werden verlässt die aktuelle Methode

Fehler: Die Out-Parameter zugewiesen werden muss, bevor die Steuerung der aktuelle Methode verlässt

-Code ist

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

es als

Aufruf 012.351.
GetPapers(web, out Id1, out Id2); 

Verwandte auf diese Frage

Related question

+1

Out-Parameter entlang aller Pfade zugewiesen werden muss, bevor die Steuerung des Verfahrens lässt. Da Sie eine if-Anweisung haben, werden sie möglicherweise nicht zugewiesen. –

+3

Was sollen die Werte sein, wenn 'rdr.Read()' false zurückgibt? –

+0

@JonSkeet Code funktioniert nur, wenn es etwas in der DB gibt, es ist wie ein Event-Empfänger –

Antwort

28

Sie Id1 und Id2 innerhalb einer zuweisen if-Anweisung und Compiler kann nicht feststellen, ob es einen Wert zur Laufzeit zugeordnet werden, so dass die Fehler.

Sie könnten ihnen einige Standardwerte vor der if-Anweisung zuweisen. Etwas wie.

Id1 = 0; 
Id2 = 0; 

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

oder geben Sie einige Standardwerte in else Teil Ihrer Bedingung.

Einem Typ out muss ein Wert zugewiesen werden, bevor die Steuerung die Funktionen verlässt. In Ihrem Fall kann der Compiler nicht bestimmen, ob Ihre Variablen zugewiesen werden oder nicht, da er innerhalb einer if-Anweisung zugewiesen wird.

See: 5.3 Definite assignment

An einer bestimmten Stelle in dem ausführbaren Code eines Funktionselementes, eine Variable gesagt wird definitiv zugeordnet werden, wenn der Compiler beweisen, durch statische Flussanalyse kann, dass Die Variable wurde automatisch initialisiert oder war das Ziel von mindestens einer Zuweisung.

+0

Wow, das scheint super gebrochen, warum würden sie diese Design-Wahl machen? – Harrichael

2

Sie müssen diese Variablen initialisieren;

es muß einen gewissen Wert halten, bevor sie von den Getpapers zurückgegeben() Methode

Verwandte Themen