一般交换难度
本文关键字:交换 | 更新日期: 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);