5
short s;
s = (EitherTrueOrFalse()) ? 0 : 1;

これは失敗します:

エラー CS0266: 型 'int' を 'short' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)

なぜそうなのか、誰か説明できますか?私が考えることができる唯一のことは、次のようなものを書いた場合、コンパイラは2番目の値を見ておらず、2つの間の範囲を知らないということです.

short s;
s = (EitherTrueOrFalse()) ? 0 : 65000;

正しい?唯一の修正は醜いキャストですか?

また、C# には short 型の型サフィックスがないようです。それはかなり重大な見落としです。そうでなければ、それは解決策だったでしょう...

4

3 に答える 3

11

コンパイラは、定数式からさまざまなプリミティブ型への暗黙的な変換を行いますが (値が適切な範囲内にある限り)、ここでは式は定数ではなく、単なる int 式です。以下とほとんど同じです。

short s;
s = CallSomeMethodReturningInt32();

コンパイラに関する限り。

2 つのオプションがあります。式全体をキャストすることも、後者の 2 つのオペランドをそれぞれキャストすることもできます。

short s = (EitherTrueOrFalse()) ? (short) 0 : (short) 1;

全体の表情をタイプにしshortます。この特定のケースでは、リテラルを明示的に宣言する数値リテラル サフィックスがないのは残念ですshort。どうやら言語設計者はこれを考慮していたようですが、比較的まれな状況であると感じていました。(多分同意すると思います。)

暗黙の定数変換に関する部分は、C# 3.0 仕様セクション 6.1.8 からのものです。

6.1.8 暗黙的な定数式の変換

暗黙的な定数式の変換により、次の変換が可能になります。

  • 型の定数式(§7.18) は 、定数式の値 が変換先の型の範囲内にある場合、型intsbyte、、、、、 またはに変換できます。byteshortushortuintulong
  • 定数式値が 負でなければ、 typeの 定数式を typelongに変換できます。ulong
于 2009-11-04T10:04:20.243 に答える
1

キャストは実行時ではなくコンパイラによって行われるため、醜いキャストとは呼ばず、複雑な構文と呼びます。

s = (EitherTrueOrFalse()) ? (short)0 : (short)1;

つまり、見苦しくても、これが C# で書かれた方法です。

このブログ記事を参照してください。その質問に対する Marc Gravell の回答を参照してください。

于 2009-11-04T10:05:03.130 に答える
0

これには、これがコンパイルされないのと同じ理由があると思います。

short s1 = GetShort1();
short s2 = GetShort2();
short s3 = s1 + s2;

つまり、short が何かに使用されると、int に昇格されます。

于 2009-11-04T10:07:52.030 に答える