1

C# (null 許容型)

int a = 10;
int? b = 20;
int? c = null;

System.Console.WriteLine( a+c??b );

出力: 20

(c??b +a) の場合、出力は 30 です

理由がわかりません..

4

6 に答える 6

2

あくまで優先順位の問題です。

これ:

System.Console.WriteLine(a + c ?? b);

次と同等です。

System.Console.WriteLine((a + c) ?? b);

a + cは null (cが null のため) であるため、20 が出力されます ( の値b)

これに対して:

System.Console.WriteLine(c ?? b + a);

次と同等です。

System.Console.WriteLine(c ?? (b + a));

cは null であるため、RHS ( b + a) が評価され、それは 30 です。

于 2012-09-17T16:49:42.120 に答える
1

ここを確認してください: ECMA-334: 14.2.1 演算子の優先順位と結合性

Null 合体演算子 (??) の優先順位は、'+' の優先順位よりも非常に低くなります。したがって、「+」は常に最初に評価されます。

あなたの場合、

int a = 10;
int? b = 20;
int? c = null;

a+c??b は (a+c)??b = (10+null)??20 = null??20 = 20 として評価されます。

c??b+a は c??(b+a) = null??(10+20) = (10+20) = 30 として評価されます

于 2012-09-17T17:02:15.453 に答える
1

c??b + a は次のように評価されます

 c?? (b+a)

または少し拡大

 c == null ? b + a : c

または、実際の値に置き換える場合

 null == null ? 20 + 10 : null) 

一方、 a +c??b は次のように評価されます

 (a+c)??b

または、少し拡大すると

 (a + c) == null ? b : c+a

または、実際の値に置き換える場合

 (10 + null) == null ? 20 : 10 + null

これも短縮できます

 null == null ? 20 : null

少なくとも 1 つのオペランドが null の場合、null 許容型の加算演算子は常に null を返します。

于 2012-09-17T16:47:17.630 に答える
1

あなたが書くとき:

  System.Console.WriteLine( a+c??b );

次のように効果的に評価されます。

        int? temp = a + c;
        System.Console.WriteLine(temp ?? b);

上記の「temp」は null なので、 の結果が得られますb

于 2012-09-17T16:48:23.883 に答える
0

c が null なので、答えは b です! それはあなたのダブルですか?行う。

于 2012-09-17T16:45:27.117 に答える
0

??演算子は、null をチェックするために使用されます。問題の値を返すか、null の場合はフォールバックを返します。

c ?? b「c が null でない限り、c を意味します。c が null の場合は b」を意味します。

c ?? b + ac をチェックして null であることを確認し、代わりに b (20) を使用します。次に、(10) を追加して 30 を取得します。*

a + c ?? bc だけでなく to を適用しているようで、全体が b (20) に置き換えられ??ます。a + c

*この場合の操作の順序については不明です。c が null であるため、(b + a) を使用している可能性があります。

于 2012-09-17T16:49:01.747 に答える