2011-04-16 15 views
10

estoy procedentes de C++, donde es fácil hacer algo como esto:de intercambio genérico dificultad

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

y luego utilizarlo para cambiar los valores en un recipiente:

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

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

Sin embargo, al intentar a hacer lo mismo en C#

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

me sale el error "propiedad o indizador no se pueden pasar como out o ref parámetro "

¿Por qué es esto y cómo puedo superarlo?

Muchas gracias

+0

Propiedades e indexadores se introducen por la conveniencia de usarlos como si fueran valores (incluso si bajo el capó son múltiples métodos), pero esta es una de las razones No me gustan. Al menos, debería haber habido alguna manera de hacer lo que quiere hacer el trabajo, pero actualmente, la mayoría de los nuevos lenguajes apestan en ese punto. – comco

Respuesta

2

No se puede utilizar indexadores o propiedades ref parámetros. El motivo es que está afinando una referencia al objeto, pero no a la ubicación, por lo que cualquier efecto que la función tendría realmente no cambiaría la fuente, ya que no la escribiría de nuevo en la ubicación (es decir, no llamaría al colocador en el caso de una propiedad). Debe pasar la matriz en el método para que el método pueda establecer valores y índices, así como saber qué valores intercambiar.

0

Las propiedades y el indexador son en realidad métodos (creados por el compilador detrás de las escenas), por lo que supongo que no es posible hacer llamadas por referencia en ellos. Sin embargo, usted podría escribir un método como este:

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

Sí, lo sé, pero se siente como un truco. :(Gracias. – mat

+1

Según la información de MSDN, parece que las matrices en C# no son un tipo de estructura que utiliza punteros (también existen tales cosas en un contexto inseguro), pero las matrices se derivan de System.Array por lo que no hay "rápido/directo" acceso ". Para que su código sea más claro, puede ajustar ese código en un método de extensión que lo haga más legible. – jCoder