質問

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に宣伝されることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top