考虑这段代码:
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
。
为什么?
答案 0 :(得分: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
(object V
)。 2.3
V
x.Value = V
(内部属性值将转换为int
)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)
赋值运算符将右侧操作数的值分配给左侧的变量,返回指定的值。它不会获取变量或属性的新值。