换句话说,C# operator= 将返回正确的值,不是吗?但是 C++ 通常返回左值,对吧?
最佳答案
不,赋值表达式的结果是赋值的值,而不是右边的表达式。所以考虑一下:
byte a;
int b;
byte c = 10;
a = b = c; // Fails to compile
这将无法编译,因为尽管
b = c
有效,但它是 int
类型的表达式,然后不能将其分配给 a
类型的 byte
。来自 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
的转换,这会创建一个 Value=50 的 BType
。对 a
的赋值需要从 BType
到 ACType
的转换,这会创建一个 Value=25 的 ACType
。