You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#调用方法赋值返回值给数组时,为何使用调用时的数组引用?

为什么调用Get()后foo[0]的结果是0而不是5?

这个问题的核心在于C#赋值表达式的求值顺序规则,咱们一步步拆解代码执行流程,就能明白问题出在哪了:

首先,程序启动时静态字段foo被初始化,指向一个长度为1的int数组,数组元素默认值是0。

接下来进入Main()方法执行foo[0] = Get();这行代码,C#会严格按照以下顺序执行:

  • 第一步:先处理赋值运算符左边的foo[0]——此时会先获取当前foo的引用(也就是初始化时的那个旧数组),确定要赋值的内存位置(旧数组的第0个元素)。这一步完成后,不管后面foo的引用怎么变,这个赋值目标位置已经固定了。
  • 第二步:调用Get()方法,里面执行了foo = new int[1];——这时候foo的引用被更新成了一个全新的数组,但这和第一步已经确定的赋值目标没有任何关系。
  • 第三步:把Get()返回的5赋值到第一步确定的旧数组的第0个元素上。

而你接下来执行Console.WriteLine(foo[0]);时,foo已经指向了Get()里创建的新数组,新数组的元素默认值是0,所以输出的是0。

咱们可以加个小验证来确认这个逻辑:

class Program {
    static int[] foo = new int[1];
    static void Main() {
        var oldFoo = foo; // 提前保存旧数组的引用
        foo[0] = Get();
        Console.WriteLine(foo[0]); // 输出"0"(新数组的元素)
        Console.WriteLine(oldFoo[0]); // 输出"5"(旧数组的元素确实被赋值了)
    }
    static int Get() {
        foo = new int[1];
        return 5;
    }
}

简单来说,C#语言规范明确规定:赋值运算符左边的操作数会被完全求值之后,才会去求值右边的操作数,最后执行赋值操作。所以哪怕右边的方法修改了左边依赖的变量,也不会改变已经确定好的赋值目标。

内容的提问来源于stack exchange,提问作者tigrou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:15:51