为什么 "return ref a[0]" 不改变原来的数组?

why "return ref a[0]" doesn't change the original array?

我打算return引用一个数组中的值(并对其进行操作),但是,当我在 method() 中传递数组时,结果不是我想要的。

而且我也很好奇我不能使用DEBUG监视器来查询method()堆栈中&a的地址。

谁能帮助我正确使用 return ref

static void Main(string[] args)
{

    int?[] s = new int?[5] { 1, 2, 3, 4, 5 };
    var q = method(ref s);
    q = 999;
    Console.WriteLine("s0 is " + s[0].ToString());
}

static ref int? method(ref int?[] a)
{
    a[1] = 888;
    return ref a[0];
}

发生这种情况是因为 q 不是本地引用。它只是一个常规变量。你也没有在方法调用之前说 ref ,所以这只是一个常规的按值赋值。由于这些原因,q 不是 a[0].

的别名

documentation给出了类似的例子:

Assume the GetContactInformation method is declared as a ref return:

public ref Person GetContactInformation(string fname, string lname)

A by-value assignment reads the value of a variable and assigns it to a new variable:

Person p = contacts.GetContactInformation("Brandie", "Best");

The preceding assignment declares p as a local variable. Its initial value is copied from reading the value returned by GetContactInformation. Any future assignments to p will not change the value of the variable returned by GetContactInformation. The variable p is no longer an alias to the variable returned.

要解决此问题,您可以在 var 之前添加 ref 以使 q 成为本地引用,并在调用之前添加 ref 使其成为 by -ref 赋值:

ref var q = ref method(ref s);