Общая сложность своп - PullRequest
       14

Общая сложность своп

10 голосов
/ 16 апреля 2011

Я пришел из 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»

Почему это так и как я могу преодолетьэто?

Большое спасибо

Ответы [ 2 ]

2 голосов
/ 16 апреля 2011

Нельзя использовать индексаторы или свойства ref параметров. Причина в том, что вы перенастраиваете ссылку на объект, но не на местоположение, так что любой эффект, который могла бы иметь функция, на самом деле не изменил бы источник, так как не записал бы его обратно в местоположение (то есть не вызвал бы сеттер в случае имущество). Вам необходимо передать массив в метод, чтобы метод мог задавать значения индексов, а также знать, какие значения поменять местами.

0 голосов
/ 16 апреля 2011

Свойства и индексатор на самом деле являются методами (созданными компилятором за кулисами), поэтому я полагаю, что по ним невозможно выполнить вызов по ссылке. Однако вы можете написать такой метод:

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);
...