暗黙のint->三元ステートメントでの短い変換はありません
-
16-09-2019 - |
質問
short s;
s = (EitherTrueOrFalse()) ? 0 : 1;
これは失敗します:
エラーCS0266:タイプ「int」を暗黙的に「短い」に変換することはできません。明示的な変換が存在します(キャストがありませんか?)
なぜそうなのかを誰かが説明できますか?私が考えることができる唯一のことは、コンパイラが2番目の値を見ておらず、2つの間の範囲を知らないということです。
short s;
s = (EitherTrueOrFalse()) ? 0 : 65000;
正しい?唯一の修正は醜いキャストの場合ですか?
また、C#には短いタイプのタイプの接尾辞がないようです。それはかなり重大な監督です。そうでなければ、それは解決策だったでしょう...
解決
コンパイラには、aから暗黙的な変換があります 絶え間ない さまざまな原始タイプへの表現(値が適切な範囲内にある限り)が、ここでは式は一定ではありません - それは単なるINT式です。それはかなり同じです:
short s;
s = CallSomeMethodReturningInt32();
コンパイラに関する限り。
2つのオプションがあります - 表現全体をキャストするか、後者の2つのオペランドのそれぞれをキャストできます。
short s = (EitherTrueOrFalse()) ? (short) 0 : (short) 1;
全体的な式タイプを作成します short
. 。この特定のケースでは、明示的に宣言する数値リテラルサフィックスがないのは残念です short
リテラル。どうやら言語デザイナーはこれを考えていたようですが、それは比較的まれな状況であると感じました。 (私はおそらく同意すると思います。)
暗黙の定数変換に関する部分は、C#3.0 Specセクション6.1.8からのものです。
6.1.8暗黙の定数発現変換
暗黙の定数発現変換により、次の変換が可能になります。
- a 定数発現 (§7.18)タイプの
int
sbyteタイプに変換できます。byte
,short
,ushort
,uint
, 、 またulong
、の値を提供します 定数発現 宛先タイプの範囲内です。- a 定数発現 タイプの
long
タイプに変換できますulong
, 、の値を提供します 定数発現ネガティブではありません。
他のヒント
なぜなら キャストはコンパイラによって行われます, 、実行時ではなく、私はそれを醜いキャストとは呼びません、私はそれを複雑な構文と呼びます:
s = (EitherTrueOrFalse()) ? (short)0 : (short)1;
つまり、これはc#で書かれている方法です。
これを参照してください ブログ記事。見る Marc Gravellの答え その質問について。
これにはコンパイルされないのと同じ理由があると思います。
short s1 = GetShort1();
short s2 = GetShort2();
short s3 = s1 + s2;
つまり、何かにショートが使用されるたびに、それはintに宣伝されることです。