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

标签 c#

鉴于以下代码:

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/

    相关文章:

    c# - 在 EntLib 中登录/注销

    C# 和 Winforms TextBox 控件 : How do I get the text change?

    c# - 无法从方法组转换为对象移植 WFP => UWP

    c# - .net C# 中不安全正常吗?

    c# - Action 字典期望其键的类型

    c# - 向已序列化但不需要序列化的对象添加方法

    c# - Specflow BeforeTestRun 记录

    c# - 无法反序列化当前 JSON 对象(例如 {"name":"value"})

    c# - dataTable.DefaultView.Rowfilter 总是返回第一行

    c# - 使用 URI 类时保持 url 编码