可能重复:
为什么赋值语句返回一个值?
在 C# 中,您可以将属性同时用作左值和右值,如下所示:
int n = N = 1;
这是一个完整的 C# 示例:
class Test
{
static int n;
static int N
{
get { System.Console.WriteLine("get"); return n; }
set { System.Console.WriteLine("set"); n = value; }
}
static void Main()
{
int n = N = 1;
System.Console.WriteLine("{0}/{1}", n, N);
}
}
你不能在C++/CLI中这样做,因为赋值表达式 "N = 1" 的结果类型是void。
EDIT1:这是一个 C++/CLI 示例,它显示了这一点:
ref class A
{
public: static property int N;
};
int main()
{
int n = A::N = 1;
System::Console::WriteLine("{0}/{1}", n, A::N);
}
EDIT2:此外,这确实令人困惑:我所期望的是会调用getter来分配给n,而事实并非如此;n 直接接收表达式的最右边的值,即 1,如生成的 CIL 所示:
IL_0001: ldc.i4.1
IL_0002: dup
IL_0003: call void Test::set_N(int32)
IL_0008: nop
IL_0009: stloc.0
那么,允许将void-expression用作 rvalue 的 C# 语法背后的魔力是什么?
这种特殊处理是否仅适用于属性,还是您知道其他类似的 C# 技巧?
编辑:正如指出的 C# 赋值规则所说,右值应该始终用作赋值的返回值。