-2

重複の可能性:
代入ステートメントが値を返すのはなぜですか?

C#では、次のようにプロパティをlrvaluervalueの両方として同時に使用できます。

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);
    }
}

代入式「N=1」の結果の型はvoidであるため、 C ++/CLIではこれを行うことはできません。

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:さらに、これは本当に紛らわしいです:私が期待していたのは、ゲッターがnに割り当てるために呼び出されるということでしたが、これはまったく当てはまりません。nは、式の右端の値を直接受け取ります。つまり、生成されたCILで示されるような1です。

IL_0001:  ldc.i4.1
IL_0002:  dup
IL_0003:  call       void Test::set_N(int32)
IL_0008:  nop
IL_0009:  stloc.0

では、 void式を右辺値として使用できるようにするC#構文の背後にある魔法は何ですか?

この特別な扱いはプロパティでのみ利用できますか、それともこのような他のC#のトリックを知っていますか?

編集:指摘されているように、C#の代入規則では、代入の戻り値として常に右辺値を使用する必要があるとされています。

4

3 に答える 3

1

なんて魔法なのか、それを2つの表現として見てみてください。

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 に答える