2009-11-03 20 views
3

在c#中我試圖實現一種方法,我可以使用它將數據綁定到我傳給它的任何控件(當然提供的控件是從一個databoundcontrol對象)當在方法中傳遞對派生對象的引用時出錯

給出的方法

public void CTLBindData(ref DataBoundControl ctl){ ... } 

我在嘗試導出的控制傳遞給功能
例如下面的代碼時的錯誤

DropDownList lister = new DropDownList(); 
CTLBindData(ref lister); 

生成轉換錯誤

好吧,我可以接受,但下面混淆了我(可能是因爲我用C++而不是C#)

CTLBindData(ref (DataBoundControl)lister); 
在這種情況下,我得到的錯誤

「A REF或out參數必須是可分配的變量」

的澄清DROPDOWNLIST從從DataBoundControl

這是沒有意義的我,我應該繼承列表控件繼承能夠傳入從數據綁定控件派生的任何對象。似乎明確的類型轉換正在導致這個問題。

任何線索,我做錯了什麼?

DC

+0

@Andrew的答案是正確的,但是,你確定它必須通過ref?從邏輯上講,您可能會返回不同類型的不同對象。如果你不打算用CTLBindData中的新對象來分配它,那麼在傳遞它和不傳遞參數之間沒有區別。 – Elisha 2009-11-03 05:12:57

+0

你是說c#默認爲傳遞對象作爲參考不值? 對我來說它是不合邏輯的,你可以得到一個不同的對象,除非refs比實際引用更接近指針。 – DeveloperChris 2009-11-03 05:28:31

+0

使用'ref'可以讓不同的對象回來。如果您在我的答案中閱讀了鏈接,這說明它比我們任何人在評論中都好得多。 – 2009-11-03 05:38:21

回答

6

執行鑄造之前調用這樣的方法:

DataBoundControl countrol = (DataBoundControl)lister; 
CTLBindData(ref control); 

C#要求任何ref參數是確切型(無多態性)和該類型的基準的必須是可分配的。這就是爲什麼您必須通過在單獨步驟中進行顯式強制轉換來創建參考,以便該方法具有可以分配值的正確類型的參考。

有關此主題的更多信息,請參閱Why do ref and out parameters not allow type variation?通過埃裏克利珀:

如果您有需要的「X」 那麼你必須通過 X型的或表達的東西轉化爲方法X. 說一個從X派生的類型的表達式 。但是如果你有一個方法 需要一個「ref X」,你必須將一個 ref傳給一個類型爲X的週期變量period。 這是爲什麼?爲什麼不允許類型爲 ,因爲我們使用非ref調用呢?

+0

這不是製作控件的副本並丟失它的Listbox類嗎?DataBoundControl countrol =(DataBoundControl)lister; 創建一個對控件的引用? – DeveloperChris 2009-11-03 05:39:15

+0

您只需創建參考副本,而不是控件本身的副本。新的參考指向相同的確切對象並且沒有轉換正在發生。 – 2009-11-03 05:43:17

+0

我想我現在明白了。在c#中賦值(=)運算符創建一個對象的引用,而不像C++那樣創建對象的副本如果你想在C++中引用,你必須指定&運算符 – DeveloperChris 2009-11-03 05:56:20

0

Andrew Hare是正確的,但在這種情況下,您甚至可能不想使用ref。 C#中的對象已經通過引用*傳遞。 (與值類型相反,除非使用ref關鍵字,否則不會通過引用傳遞。)我很少會遇到這種情況,您可能會想到實際需要以這種方式傳遞引用類型的位置。沒有ref,你的原代碼應該可以正常工作。

**並非如此,但如果您來自非C#背景,則更容易理解。該引用實際上是按值傳遞的。 There is an excellent article關於這一切如何工作。*

+0

儘管我同意'ref'在這裏可能不需要,但重要的是區分對象不是通過引用傳遞的。而對象引用是按值傳遞的。 – 2009-11-03 05:26:13

+0

確實。我補充說明我的答案。 – 2009-11-03 05:26:49

相關問題