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 参数传递”

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

非常感谢

4

2 回答 2

2

您不能使用索引器或属性参考参数。原因是您正在重新调整对对象的引用而不是位置,因此该函数所产生的任何影响实际上都不会更改源,因为它不会将其写回该位置(即在 a 的情况下不调用 setter财产)。您需要将数组传递给方法,以便该方法可以设置值和索引以及知道要交换的值。

于 2011-04-16T13:04:19.407 回答
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);
于 2011-04-16T13:05:36.350 回答