-2

可能重复:
为什么赋值语句返回一个值?

在 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# 赋值规则所说,右值应该始终用作赋值的返回值。

4

3 回答 3

1

什么神奇,试着把它看成两个表情。

N = 1;//sets N to 1
n = N;//sets n to the value of N, which is 1

有什么不明白的?

于 2012-11-28T10:14:12.583 回答
1

你在这里这里都有答案

基本上:

首先,赋值语句不返回值。赋值表达式返回一个值。赋值表达式是合法的声明;在 C# 中只有少数表达式是合法的语句:实例构造、递增、递减、调用和赋值表达式可以在需要语句的地方使用。

简单赋值表达式的结果是赋值给左操作数的值。结果与左操作数具有相同的类型,并且始终归类为值。

于 2012-11-28T10:30:36.633 回答
1

在 C# 中,赋值是赋值本身的结果。

例如:

string a = null;

if((a = "hello world").Contains("world"))
{
      Console.WriteLine("It has 'world' word!");
}

如您所见,这与属性无关,而是与分配有关。

像这样的声明:

int n = N = 1;

...相当于:

int n = (N = 1);

关键是(N = 1)它本身有一个返回值:一个整数值1

于 2012-11-28T10:35:24.353 回答