2009-10-22 78 views
4

我熟悉用於傳遞簡單的數據類型進行操作,但我似乎無法弄清楚如何通過這個Queue<>而不會導致編譯錯誤。有任何想法嗎?出錯的C#語法功能參數

代碼:

Queue<SqlCommand> insertScriptQueue = new Queue<SqlCommand>(); 

private void UpdateDefaultIndicator(int newDefaultViewID, 
            out (Queue<SqlCommand>) insertScriptQueue) 

UpdateDefaultIndicator(newViewID, out (Queue<SqlCommand>)insertScriptQueue); 
+1

你得到了什麼編譯器錯誤?並嘗試省略第二行代碼中的()隊列。 還可以使用編輯欄上方的101010按鈕將代碼設置爲代碼。它使它更好的可讀性:) – pyrocumulus 2009-10-22 21:39:54

+0

在調用UpdateDefaultIndicator時,「insertScriptQueue」的類型是什麼?看起來你正在投射參數,這與使用'out'一起是非法的。 – 2009-10-22 21:42:54

+1

鑑於此代碼存在多個明顯問題,如果您可以發佈適用於您的代碼,那將會很不錯。 – 2009-10-22 21:44:29

回答

2

隊列會通過引用傳遞無論如何,它不是一個值類型的內部分配insertScriptQueue某種價值。只是不要使用'出'。更新:請原諒我,我正在考慮'ref' - 但事實上,您傳遞的是一個Queue數據類型,而不僅僅是一個未分配的引用,這讓我認爲您無論如何都想使用'ref'。除非你不需要使用'ref',因爲Queue不是一個值類型;其默認情況下已經通過'參考'傳遞。

+1

它不會被「通過引用」傳遞 - 引用將通過值傳遞。這是一個微妙的差異,但是一個重要的差異。 「ref」和「out」對於參考類型仍然很重要。請參閱http://pobox.com/~skeet/csharp/parameters.html – 2009-10-22 22:13:44

+0

謝謝!優秀的細節。所以Queue是一個引用類型,'ref'參數的必要性取決於他是否將該參數設置爲其函數中的另一個Queue對象,並且期望調用者看到新對象。 – Bruce 2009-10-22 23:59:34

4

你不應該被初始化了變量。如果您需要修改範圍內變量,請改爲使用ref。

正如Ed在他的評論中指出的那樣,「修改」可能不會讓你對這裏發生的事情有個全面的瞭解 - 引用類型的out參數將在函數調用結束時定義爲初始化對象。正如大多數其他答案指出的,如果你想傳入一個初始化對象,ref是更強的選擇。

+0

你真的是指「如果你需要修改一個值類型的變量或者爲參考類型指定一個新的對象參數」 – 2009-10-22 21:43:54

+0

我檢查了文檔,它似乎確實可以初始化一個out變量;大概當舊的值的引用在函數返回一個新的時候被丟棄。 – Bruce 2009-10-22 21:47:40

3
Queue<SqlCommand> insertScriptQueue; 

private void UpdateDefaultIndicator(int newDefaultViewID, 
           out Queue<SqlCommand> insertScriptQueue){/*body*/} 

UpdateDefaultIndicator(newViewID,out insertScriptQueue); 

這對我來說工作正常......你得到什麼錯誤?

3

爲什麼你想要一個「出」......在這裏...爲什麼你不返回類型呢?讓方法返回Queue <> insteasd的void ..會爲你工作嗎?

5

您正在傳入參考類型。無需使用。

+1

'out'與傳遞引用類型有什麼關係? 'out'修飾符只允許你使用一個未初始化的變量(可以是一個值類型或引用類型)並確保它在方法本身中被初始化。 – LukeH 2009-10-22 21:55:54

+0

好的;在這個特定的上下文中不需要使用OR或者ref。在傳遞它之前,他已經初始化了他的變量。 – gn22 2009-10-22 21:57:31

0

確保您在UpdateDefaultIndicator方法

0

順便提一下,原始問題的答案是您正在投射到隊列,並且演員正在返回臨時參考。該引用不可分配,因此不是合法的輸出參數。 Erich的代碼實現了這個問題的修復。