最後のものが機能しない理由を誰かが知っていますか?
object nullObj = null;
short works1 = (short) (nullObj ?? (short) 0);
short works2 = (short) (nullObj ?? default(short));
short works3 = 0;
short wontWork = (short) (nullObj ?? 0); //Throws: Specified cast is not valid
最後のものが機能しない理由を誰かが知っていますか?
object nullObj = null;
short works1 = (short) (nullObj ?? (short) 0);
short works2 = (short) (nullObj ?? default(short));
short works3 = 0;
short wontWork = (short) (nullObj ?? 0); //Throws: Specified cast is not valid
は暗黙的にオブジェクトに変換される (ボックス化された) int であるため0
、ボックス化された int を直接 short にアンボックスすることはできません。これはうまくいきます:
short s = (short)(int)(nullObj ?? 0);
ボックス化されたT
(T
はもちろん、null を許容しない値の型です) は、T
またはに対してのみボックス化を解除できますT?
。
最後の行の null 合体演算子の結果は boxedint
です。次に、それを にアンボックスしようとしてshort
いますが、これは実行時に示した方法で失敗します。
それはあなたがこれをしたようなものです:
object x = 0;
short s = (short) x;
null 合体演算子の存在は、ここでは少し厄介です。