1. ホーム
  2. c#

if-elseでは変換されないのに、なぜ ?: では変換エラーになるのですか?重複

2023-11-07 01:25:22

質問

コードを少し変更し、次の行を使用します。

uint a = b == c ? 0 : 1;

Visual Studioではこのようなエラーが表示されます。

型 'int' を 'uint' に暗黙的に変換することはできません。明示的な変換が存在します(キャストが抜けていませんか?)。

でも、このコードでいくと

uint a; 

if (b == c) 
    a = 0; 
else 
    a = 1;

エラーや警告が出ることなく、正常に動作しています。なぜでしょうか?

どのように解決するのですか?

<ブロッククオート

なぜ uint a = b == c ? 0 : 1; ?

式の型 b == c ? 0 : 1int . で示されるように この表 から暗黙のうちに変換されることはありません。 int から uint に変更することはできません。

なぜ a = 0 ?

値が定数式の場合、数値型には特別な扱いがあるため。

C#仕様書6.1.9項より。

  • int型の定数式は、定数式の値が変換先の型の範囲内であれば、sbyte、byte、short、ushort、uint、ulong型に変換することができる。

  • long型の定数表現は、定数表現の値が負でない限り、ulong型に変換することができる。

最初の箇条書きにあるように a = 0a = 1 はどちらも許可されています。 01 は定数表現であり、有効な uint の値です。基本的には、コンパイラはコンパイル時にこれらの変換が有効であると容易に判断できるため、変換を許可しているということです。

ちなみに、もし b == c の部分を定数表現に変更した場合 (例. true のように)変更した場合、条件演算子式全体が定数式になり、コードはコンパイルされます。