C# 在一条语句中分配多个值

C# 在一条语句中分配多个值,c#,C#,考虑以下代码: class X { int _value; public object Value { get { return _value; } set { _value = Convert.ToInt32(value); } } } X x = new X(); object y = x.Value = 2.3; 对我来说,它看起来像y==2.0,因为这是x.value的返回值,但结果是y==2.3,即使x.value==2 为什么?线路 object y = x.

考虑以下代码:

class X
{
     int _value;
     public object Value { get { return _value; } set { _value = Convert.ToInt32(value); } }
}

X x = new X();
object y = x.Value = 2.3;
对我来说,它看起来像
y==2.0
,因为这是
x.value
的返回值,但结果是
y==2.3
,即使
x.value==2

为什么?

线路

object y = x.Value = 2.3;
相当于

object y = 2.3;
x.Value = 2.3;
所以,你会得到结果

y = 2.3
x.Value = 2
更新

研究IL代码后的一些附加信息:

我们有浮点值
2.3
y
x.Value
需要对象类型。在这种情况下:

  • 编译器声明了一个新变量,我们称之为
    V
    objectv
  • 按下堆栈浮点值
    2.3
  • 将此值装箱到对象
  • 复制堆栈顶部的值。因此,我们将在堆栈中有两个相同的装箱值(#1,#2)
  • 弹出#2并将其分配给
    V
  • 分配
    x.Value=V
    (内部属性值将转换为
    int
  • 弹出#1并将其分配给
    V
  • 分配
    y=V
因此,我们有如下情况:

object V = (object)2.3;
x.Value = V;
y = V;

我猜这只是在同一时间,而不是一个接一个地增加值

换句话说,当你写作的时候

object y = x.Value = 2.3;
它被解释为

x.Value = 2.3; 
object y = 2.3;

赋值运算符将右侧操作数的值赋值给左侧的变量,返回赋值。它不会获取变量或属性的新值。

此代码段的返回值:

x.Value=2.3

不是
x.Value
。getter未运行。赋值运算符返回要赋值的值,以便可以进行多次赋值

执行顺序如下:

object V = (object)2.3;
x.Value = V;
y = V;
首先,2.3被分配给
X.value
。我们不关心setter如何处理它,语句
(X.value=2.3)
返回值2.3

第二,从(X.value=2.3)返回的语句被分配到
y

这一概念使多重分配看起来像两个独立的分配:

X.value = 2.3
object y = 2.3

那不是真的。根据C标准,
a=b=C相当于
a=(b=c),因为赋值运算符是右关联的。见本标准第7.17节。虽然这方面的标准似乎有点古怪……谢谢,Skeet的回答很好地解释了这一点。如果你问我的话,这是错误的做法。