Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通用交换困难 我来自C++,在这里很容易做这样的事情:< /P> template<class T> void Swap(T &a, T &b) { T temp = a; a = b; b = temp; } 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); 模板 无效掉期(T&a、T&b) { 温度T=a; a=b; b=温度; }_C#_Generics_Swap_Indexer - Fatal编程技术网

C# 通用交换困难 我来自C++,在这里很容易做这样的事情:< /P> template<class T> void Swap(T &a, T &b) { T temp = a; a = b; b = temp; } 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); 模板 无效掉期(T&a、T&b) { 温度T=a; a=b; b=温度; }

C# 通用交换困难 我来自C++,在这里很容易做这样的事情:< /P> template<class T> void Swap(T &a, T &b) { T temp = a; a = b; b = temp; } 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); 模板 无效掉期(T&a、T&b) { 温度T=a; a=b; b=温度; },c#,generics,swap,indexer,C#,Generics,Swap,Indexer,然后使用它交换容器中的值: std::vector<int> someInts; someInts.push_back(1); someInts.push_back(2); Swap(someInts[0], someInts[1]); std::vector someInts; 一些要点。推回(1); 一些要点。推回(2); 交换(someInts[0],someInts[1]); 然而,在尝试用C做同样的事情时# 无效掉期(参考T a、参考T b) { 温度T=a; a=b

然后使用它交换容器中的值:

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

Swap(someInts[0], someInts[1]);
std::vector someInts;
一些要点。推回(1);
一些要点。推回(2);
交换(someInts[0],someInts[1]);
然而,在尝试用C做同样的事情时#

无效掉期(参考T a、参考T b)
{
温度T=a;
a=b;
b=温度;
}
我得到错误“属性或索引器不能作为out或ref参数传递”

这是为什么?我如何克服它


非常感谢

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

属性和索引器实际上是方法(由编译器在后台创建),因此我认为不可能对它们进行引用调用。但是,您可以编写如下方法:

template<class T>
void Swap(T &a, T &b)
{
  T temp = a;
  a = b;
  b = temp;
}
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);
public void Swap(T[]数据,int a,int b){
温度=数据[a];
数据[a]=数据[b];
数据[b]=温度;
}
交换(某些整数,0,1);

是的,我知道,但感觉像是黑客攻击(谢谢。根据MSDN提供的信息,C#中的数组似乎不是某种使用指针的结构(也存在于不安全的上下文中),但数组是从System.Array派生的,因此没有“快速/直接访问”。为了使代码更清晰,您可以将该代码包装到一个扩展方法中,使其更具可读性。引入属性和索引器是为了方便使用,就像它们是值一样(即使在幕后它们是多个方法),但这是我不喜欢它们的原因之一。至少,应该有某种方法让你想做的事情起作用,但目前,大多数新语言在这一点上都很糟糕。