一般交换难度

本文关键字:交换 | 更新日期: 2023-09-27 17:50:16

我来自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参数传递"

为什么会这样,我该如何克服?

多谢

一般交换难度

不能在参数中使用索引器或属性。原因是你返回的是对对象的引用,而不是位置,所以函数的任何影响实际上都不会改变源,因为它不会把它写回位置(即在属性的情况下不调用setter)。您需要将数组传递给该方法,以便该方法可以设置值和索引,并知道要交换哪些值。

属性和索引器实际上是方法(由编译器在幕后创建),所以我认为不可能对它们进行按引用调用。但是你可以这样写一个方法:

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