2011-04-16 81 views
10

我是從C++在那裏很容易做這樣的事情來了:通用交換困難

template<class T> 
void Swap(T &a, T &b) 
{ 
    T temp = a; 
    a = b; 
    b = temp; 
} 

,然後使用它在容器來交換值:

std::vector<int> someInts; 
someInts.push_back(1); 
someInts.push_back(2); 

Swap(someInts[0], someInts[1]); 

然而,在試圖在C#中做同樣的事情

void Swap<T>(ref T a, ref T b) 
{ 
     T temp = a; 
    a = b; 
    b = temp; 
} 

我得到錯誤「屬性或索引器不能作爲一個out或ref參數傳遞「

這是爲什麼,我該如何克服它?

非常感謝

+0

屬性和索引都介紹了,如果他們的值(即使在引擎蓋下他們是多種方法),方便使用它們,但這是原因之一我不喜歡他們。至少,應該有某種方式讓你想要做什麼工作,但是目前,大多數新語言都在這一點上吸引人。 – comco 2013-12-15 22:31:25

回答

2

您不能使用索引器或屬性參考參數。原因是你正在重新調用對象的引用而不是位置,所以任何影響函數的內容都不會實際改變源文件,因爲它不會將它寫回到位置(即在沒有調用setter的情況下屬性)。您需要將數組傳遞給方法,以便該方法可以將值設置爲索引以及知道要交換的值。

0

屬性和索引器實際上是方法(由編譯器在後臺創建),所以我認爲不可能通過引用來調用它們。然而,你可以寫這樣的方法:

public void Swap<T>(T[] data, int a, int b) { 
    T temp = data[a]; 
    data[a] = data[b]; 
    data[b] = temp; 
} 

Swap(someInts, 0, 1); 
+0

是的,我知道,但它感覺像一個黑客。 :(謝謝。 – mat 2011-04-16 14:48:15

+1

根據MSDN提供的信息,它看起來像C#中的數組不是某種使用指針的結構(這種情況也存在於不安全的上下文中),但是數組是從System.Array派生的,因此沒有「快速/直接訪問「爲了讓你的代碼更清潔,你可以將代碼包裝到擴展方法中,使其更具可讀性。 – jCoder 2011-04-16 15:21:28