2009-01-30 55 views
1

有沒有辦法在C#中做到這一點?同時通過ref和typecast傳遞

private void Caller() 
{ 
    MyControl c = new MyControl(); 
    Callee(ref c);      //Here I want to cast c as Control and pass by ref 
} 

private void Callee(ref Control c) 
{ 

} 

在泛型例子,它是如何推斷T = MyControl?你能解釋一下嗎?我是一個仿製藥的新手

回答

3

首先,我會問你是否你需要ref - 它似乎不尋常;這意味着你打算重新分配方法內的變量? (與通過實例更改屬性不同)。

對於ref,它必須是完全匹配;你可以使用:

Control tmp = c; 
Callee(ref tmp); 
c = (MyControl) tmp; 

另外,考慮泛型:

private void Callee<T>(ref T c) where T : Control 
{ ... } 

然後你可以使用Callee(ref c),它會推斷T = MyControl

(更新再評論)

在通用的例子,我們宣稱Callee作爲「T」的通用方法,其中T是至少 a Control。這個「至少」確保我們仍然可以訪問方法內部的所有Control成員(因爲任何Control的子類仍然有這些成員)。

泛型有點像模板(但不完全)。在調用方法時,調用者可以指定T.因此,來電者可以使用Callee<Control>(...),這與調用您現有的Callee(ref Control c)進行比較。或者他們可以使用Callee<MyControl>(...),這就像撥打Callee(ref MyControl c)--在兩種情況下,T都會在整個方法中被替換。

但是,C#編譯器足夠智能,通常您不需要告訴它尖括號中的位;它可以看到你通過了一個MyControl,所以它會假設(除非你另有說明)它應該使用T = MyControl--這被稱爲泛型類型推斷。這裏的要點是,它可以很容易地將ref與數據的子類一起使用。

+0

對象本身是不是通過引用傳遞的? – 2009-01-30 22:55:36

1

不,這是不可能的,這有一個很好的理由。假設你在被調用者中改變了c,併爲它賦予了另一個不是MyControl實例的Control的後代。