2012-07-31 65 views
19

雖然發回的參數收到此錯誤錯誤:out參數必須控制之前分配離開當前方法

錯誤:控制離開 當前方法之前out參數必須被分配

代碼是

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

稱其爲

GetPapers(web, out Id1, out Id2); 

與此相關的問題

Related question

+1

輸出參數必須沿着所有路徑控制離開方法之前被分配來自Getpapers(返回之前的一些值。既然你有一個if語句,他們可能不會被分配。 – 2012-07-31 10:28:16

+3

如果'rdr.Read()'返回false,你希望值是什麼? – 2012-07-31 10:28:23

+0

@JonSkeet代碼只在數據庫中有東西時才起作用,就像事件接收器一樣 – 2012-07-31 10:29:17

回答

28

要分配Id1Id2內的if語句和編譯器無法確定它是否會被分配在運行時的值,從而錯誤。

您可以在if語句之前爲它們分配一些默認值。就像是。

Id1 = 0; 
Id2 = 0; 

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

或在else部分條件中指定一些默認值。

在控件離開函數之前,out類型參數必須賦值一些值。在你的情況下,編譯器不能確定你的變量是否被賦值,因爲它是在if語句中賦值的。

參見:5.3 Definite assignment

在函數構件的可執行代碼的給定位置,一 變量被認爲是明確賦值如果編譯器 證明,通過靜態流分析,那變量已自動初始化爲 或已經成爲至少一個 賦值的目標。

+0

哇,這看起來超級破碎,爲什麼他們會做出這樣的設計選擇? – Harrichael 2017-04-06 02:39:28

2

您需要初始化這些變量;

它必須持有)方法

相關問題