gpt4 book ai didi

c# - 分配后意外的不相等

转载 作者:行者123 更新时间:2023-12-03 03:58:08 25 4
gpt4 key购买 nike

鉴于以下代码:

using System;

class MyClass
{
public MyClass x;
}

public static class Program
{
public static void Main()
{
var a = new MyClass();
var b = new MyClass();
a.x = (a = b);
Console.WriteLine(a.x == a);
}
}

前两行很明显,只是两个不同的对象。

我假设第三行执行以下操作:
  • 零件(a = b)分配 ba并返回 b ,所以现在 a等于 b .
  • 然后,a.x分配给 b .

  • 这意味着, a.x等于 b ,还有 b等于 a .这意味着 a.x等于 a .

    但是,代码打印 False .

    这是怎么回事?

    最佳答案

    这是因为您正在尝试更新 a在同一个语句中两次。 aa.x=指的是旧实例。所以,您正在更新 a引用 b和旧 a对象字段x引用 b .

    您可以通过以下方式确认:

    void Main()
    {
    var a = new MyClass(){s="a"};
    var b = new MyClass() {s="b"};
    var c =a;

    a.x = (a=b);
    Console.WriteLine($"a is {a.s}");
    Console.WriteLine(a.x == b);

    Console.WriteLine($"c is {c.s}");
    Console.WriteLine(c.x == b);
    }

    class MyClass
    {
    public MyClass x;
    public string s;
    }

    答案将是:
    a is b
    False
    c is a
    True

    编辑:只是为了更清楚一点,这与运算符的执行顺序无关,而是因为同一语句中同一变量中的两次更新。任务 (a=b)a.x= 之前执行,但没关系,因为 a.x正在引用旧实例,而不是新更新的实例。正如@Joe Sewell 的回答所解释的那样,这种情况会发生,因为找到分配目标的评估是从左到右的。

    关于c# - 分配后意外的不相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62093197/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com