c# a=b= C;等于b=c;一个= c;而c++是b= C;a = b;
本文关键字:c++ 等于 一个 | 更新日期: 2023-09-27 17:49:32
换句话说,c# operator=将返回正确的值,不是吗?但是c++通常返回左值,对吧?
不,赋值表达式的结果是赋值的值,不是右边的表达式。所以考虑一下:
byte a;
int b;
byte c = 10;
a = b = c; // Fails to compile
编译失败,因为尽管b = c
是有效的,但它是int
类型的表达式,因此不能将其赋值给byte
类型的a
。
来自c# 4语言规范,第7.17.1节:
简单赋值表达式的结果是赋给左操作数的值。结果与左操作数具有相同的类型,并且始终被分类为值。
编辑:这是b
的值被使用的证明,而不是 c
的值:
using System;
class ACType
{
public int Value { get; set; }
public static implicit operator BType(ACType ac)
{
return new BType { Value = ac.Value / 2 };
}
}
class BType
{
public int Value { get; set; }
public static implicit operator ACType(BType b)
{
return new ACType { Value = b.Value / 2 };
}
}
class Test
{
static void Main()
{
ACType a, c;
BType b;
c = new ACType { Value = 100 };
a = b = c;
Console.WriteLine(a.Value); // Prints 25
}
}
a = b = c;
语句相当于:
BType tmp = c;
b = tmp;
a = tmp;
所以b
的值不是之后读取(它不等同于b = c; a = b;
) -所以如果b
实际上是一个属性,除了副作用之外,属性的行为将是无关紧要的。它是在赋值给b
时使用的值在赋值给a
时也使用。
在本例中,对b
赋值需要将ACType
转换为BType
,从而创建一个值为50的BType
。然后,对a
赋值需要将BType
转换为ACType
,这将创建一个值为25的ACType
。
不,它在两种语言中的工作方式相同:a = b = c;
的工作方式如下:a = (b = c);
。赋值操作符从右向左操作,返回的值是赋值的结果,即左侧。因此,从概念上讲,a = b = c;
与:b = c; a = b;
是相同的。
对于c#,赋值操作符和条件操作符(?:)是右结合的,这意味着操作从右向左执行。例如,x = y = z被求值为x = (y = z)。
c++ (Source)
关于a = b = c
语义的一个有用的花边新闻是,a
确实会接收到与分配给b
的相同的值(通常是 c
*), b
的当前值不是一个因素。
是的,这可以被认为是令人惊讶的。考虑这个例子:
class Foo
{
private int _bar;
public int Bar
{
get { return _bar; }
set { _bar = value + 1; }
}
}
...
Foo foo = new Foo();
int a, c;
c = 4;
a = foo.Bar = c; // is 'a' 4 or 5?
如果该值经过foo.Bar
,然后突变进入a
,则a
为5。然而,事实并非如此。a
和foo.Bar
得到相同的值,a
没有得到来自foo.Bar
的突变。这不是你的直接问题,但考虑到一些评论,它已经足够有趣了。
*Jon Skeet有一个有趣的观察,关于隐式转换到另一个类型,但在转换过程中有数据丢失/修改。在这种情况下,值很可能不是 c
的原始值,而是转换后的值,它们可能不同。