鉴于以下代码:
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)
分配 b
至 a
并返回 b
,所以现在 a
等于 b
. a.x
分配给 b
. 这意味着,
a.x
等于 b
,还有 b
等于 a
.这意味着 a.x
等于 a
.但是,代码打印
False
.这是怎么回事?
最佳答案
这是因为您正在尝试更新 a
在同一个语句中两次。 a
在 a.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/