在单个语句中分配多个值

时间:2017-01-26 09:57:47

标签: 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

为什么?

4 个答案:

答案 0 :(得分:2)

该行

object y = x.Value = 2.3;

相当于

object y = 2.3;
x.Value = 2.3;

所以,你会得到结果

y = 2.3
x.Value = 2

<强>更新

研究IL代码后的一些其他信息:

好吧,我们有浮动值2.3yx.Value期望对象类型。在这种情况下:

  • compiller声明一个新变量,我们称之为Vobject V)。
  • 按下堆栈浮点值2.3
  • 将此值装入对象
  • 复制堆栈顶部的值。因此,我们将在堆栈中有2个相同的盒装值(#1,#2)。
  • 弹出#2并将其分配给V
  • 分配x.Value = V(内部属性值将转换为int
  • 弹出#1并将其分配给V
  • 指定y = V

结果我们有这样的事情:

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

答案 1 :(得分:2)

我猜它只是在同一时间对这些值进行设定,而不是一个接一个。

换句话说,当你写

object y = x.Value = 2.3;

它被解释为

x.Value = 2.3; 
object y = 2.3;

答案 2 :(得分:2)

这段代码的返回值:

x.Value = 2.3

不是x.Value。吸气剂没有运行。赋值运算符返回要分配的值,以便可以进行多次赋值。

执行顺序如下:

首先,2.3被分配给X.value。我们不关心setter用它做什么,语句(X.value = 2.3)返回值2.3

其次,来自(X.value = 2.3)的返回语句被分配给y

这个概念使得多个赋值看起来像两个独立的赋值:

X.value = 2.3
object y = 2.3

答案 3 :(得分:1)

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