2011-04-16 20 views
10

Ben böyle bir şey yapmak kolaydır C++ geliyorum:Jenerik Takas zorluk

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

ve daha sonra bir kap içinde değerlerini takas için kullanabilirsiniz: denemeden sonra,

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

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

Ancak C# aynı şeyi yapmak

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

hatasını "mülkiyet veya dizin dışı bir veya ref parametresi olarak geçmedi olsun "

Neden ve nasıl üstesinden gelebilirim?

Teşekkürler

+0

Özellikleri ve indeksleyiciler tanıtıldı, ancak bu nedenlerden biridir Onları sevmiyorum. En azından, çalışmak istediğiniz şeyi yapmanın bir yolu olmalıydı, ama şu anda, yeni dillerin çoğu bu noktada emiyor. – comco

cevap

2

İndeksleyicileri veya özellikleri ref parametrelerini kullanamazsınız. Bunun nedeni, nesneye bir referans göndermenizdir, ancak konumu değil, bu nedenle işlevdeki herhangi bir efekt, kaynağı tekrar yazmayacağı için kaynağı değiştirmeyecektir (örn. mülkiyet). Diziyi yönteme geçirmeniz gerekir, böylece yöntem değerlerin yanı sıra hangi değerlerin takas edileceğini bile bilir.

0

Özellikler ve dizinleyici aslında yöntemler (arkasındaki derleyici tarafından oluşturulan) yöntemidir, bu nedenle, bunların üzerine başvuruda bulunmak mümkün değildir. Böyle bir yöntem yazabilirsiniz Ancak: onlar (başlık altında birden çok yöntem vardır bile) değerleri sanki kolaylık bunları kullanmak için

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

Evet biliyorum ama bir kesmek gibi geliyor. :(Teşekkürler. – mat

+1

MSDN'den edinilen bilgilere dayanarak C# dizisindeki diziler bir dizi yapı değil (aynı zamanda güvenli olmayan bir ortamda var), ancak System.Array dizisinden türetilen dizilerdir. Bu nedenle "hızlı/doğrudan" yoktur. Kodunuzu daha temiz hale getirmek için bu kodu daha okunabilir hale getiren bir uzantı yöntemine sarabilirsiniz. – jCoder