为什么不通过ref返回为集合的元素工作?

BanksySan:

下面的引用返回示例来自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在此上下文中不能使用表达式,因为它可能不会被引用返回

为什么从数组返回却不能从集合返回呢?

Maria Ines Parnisari:

答案在您发布的同一链接中:

您只能返回“可以安全返回”的引用:传递给您的引用和指向对象字段的引用。

您的示例都不满足。您正在函数内部创建列表(因此对象将超出范围,并且其指针将无效),并且它不指向对象的字段。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不通过toUpperCase来映射工作

为什么通过flatMap进行区分工作,而不通过map的“子流”进行工作?

为什么不通过:id参数工作(在rails中)重定向到#show操作?

为什么optimizer.minimize()不通过tf.slim.learning.train()返回损失?

为什么不通过传播运算符破坏MessageEvent的返回所有属性?

js映射为什么不通过返回改变我的值

为什么BufferedWriter不通过打开的FileChannel写入文件?

为什么不通过https协议更新ubuntu

为什么不通过接口时钟模块驱动输出?

为什么grails不通过引导填充数据

为什么加法不通过元组广播?

为什么不通过闭包定义此变量?

为什么phantomjs代码不通过数组?

为什么不通过引用传递数组?

为什么字符串模板不通过CI

为什么我的XML不通过XSLT?

为什么CloudFront通过一个CNAME记录而不通过另一个CNAME记录工作?

我不明白为什么我的脚本不通过所有string.split元素迭代?

为该对象分配其他内容时,为什么不通过引用传递该对象?

VBScript不通过类返回数组

为什么通过HTML创建元素而不通过JavaScript动态创建元素时,我的Popover为何起作用?

为什么DatagramSocket不通过多播地址通过网络发送?

为什么 JavaScript 会向控制台写入一个元素,但不通过函数更新 css 显示值?

为什么RabbitMQ不通过HTTP而不是STOMP支持AMQP?

为什么我不通过webdriver关闭浏览器?

为什么数组中的值不通过我的全位加法器

为什么不通过某些安全协议完成 dns 解析?

为什么在MySQL中使用“或”不通过ORDER BY对列别名进行排序?

Linux为什么不通过TSS使用硬件上下文切换?