【发布时间】:2017-09-20 10:46:50
【问题描述】:
下面引用返回的例子来自What’s New in C# 7.0:
public ref int Find(int number, int[] numbers)
{
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] == number)
{
return ref numbers[i]; // return the storage location, not the value
}
}
throw new IndexOutOfRangeException($"{nameof(number)} not found");
}
编译没有任何问题(正如您所期望的,因为它是从 Microsoft 博客复制的)。
我写了这个:
private static ref int GetReference(string searchTerm)
{
var passwords = new Dictionary<string, int>
{
{"password", 1},
{"123456", 2},
{"12345678", 3},
{"1234", 4},
{"qwerty", 5},
{"12345", 6},
{"dragon", 7}
};
return ref passwords[searchTerm];
}
这个不能编译;它给出了以下错误:
CS8156 无法在此上下文中使用表达式,因为它可能不会通过引用返回
为什么从数组返回有效,而从集合返回无效?
【问题讨论】:
-
由于您在方法内声明了
password,因此当从GetReference返回时,它超出了范围。 GC 将(最终)删除对其的所有引用,您将无法访问正确的数据。 -
如果
passwords通过参数列表传递给方法,它会起作用,就像你的第一个例子一样。 -
我的第一次尝试是将它作为一个字段,但这也不起作用。看来它必须实际传入,而不仅仅是在范围内。
-
数组与字典不同。即使是 C# 6 中的 pre-ref 返回,您也可以将数组槽作为 ref 传递给方法,但索引器(如字典或列表中)不能。