C# (null 許容型)
int a = 10;
int? b = 20;
int? c = null;
System.Console.WriteLine( a+c??b );
出力: 20
(c??b +a) の場合、出力は 30 です
理由がわかりません..
C# (null 許容型)
int a = 10;
int? b = 20;
int? c = null;
System.Console.WriteLine( a+c??b );
出力: 20
(c??b +a) の場合、出力は 30 です
理由がわかりません..
あくまで優先順位の問題です。
これ:
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 です。
ここを確認してください: 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 として評価されます
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 を返します。
あなたが書くとき:
System.Console.WriteLine( a+c??b );
次のように効果的に評価されます。
int? temp = a + c;
System.Console.WriteLine(temp ?? b);
上記の「temp」は null なので、 の結果が得られますb
。
c が null なので、答えは b です! それはあなたのダブルですか?行う。
??
演算子は、null をチェックするために使用されます。問題の値を返すか、null の場合はフォールバックを返します。
c ?? b
「c が null でない限り、c を意味します。c が null の場合は b」を意味します。
c ?? b + a
c をチェックして null であることを確認し、代わりに b (20) を使用します。次に、(10) を追加して 30 を取得します。*
a + c ?? b
c だけでなく to を適用しているようで、全体が b (20) に置き換えられ??
ます。a + c
*この場合の操作の順序については不明です。c が null であるため、(b + a) を使用している可能性があります。