2015-09-30 3 views
7

次のコードを使用できない理由はありますか?インラインでulongを返す場合

ulong test(int a, int b) 
{ 
    return a == b ? 0 : 1; 
} 

それは私を示しています

Cannot implicitly convert type 'int' to 'ulong'. An explicit conversion exists (are you missing a cast?) 

次のように動作します:

ulong test(int a, int b) 
{ 
    return false ? 0 : 1; 
} 

私はこの問題を解決する方法を知っています。私はその理由を知りたい。

ありがとうございました。

+0

最終的なコードブロックでは、 'false'を' true'に置き換えると機能しますか?多分 '1'は' 0'で暗黙的に変換できる何らかの理由がありますか? –

+0

すでにテスト済みですが、違いはありません。 –

+6

それは '偽ですか? 0:1'は定数式です。それは 'a == bを返す? 0:1'はそうではありません。 'int'型の定数式は 'ulong'の範囲に収まると暗黙的に' ulong'に変換できます。 – PetSerAl

答えて

5

だが、第二の方法の結果として得られるILコードを見てみましょう:

IL_0000: nop 
IL_0001: ldc.i4.1 
IL_0002: conv.i8 
IL_0003: stloc.0 
IL_0004: br.s  IL_0006 
IL_0006: ldloc.0 
IL_0007: ret 

IL_0001でリテラル1はスタックにプッシュされる(したがって、発現return false ? 0 : 1;は、コンパイル時に評価され、ILに埋め込まれます定数として)、IL_0002にこのリテラルはInt64に変換されます。

MSDNから

定数式(セクション7.15)int型のが 型sbyte、バイト、ショート、USHORT、UINT、またはULONGに変換することができ、 定数の値を提供-expressionは宛先タイプの範囲内です。

1ulongデータ型の範囲にあるため、このような変換は常に成功します。コンパイラはそれを知っているため、暗黙の変換を実行します。

0

これは動作します:あなたは、特定のタイプをしたい場合、あなたは接尾辞を与えなければならないので、

ulong test(int a, int b) 
{ 
    return a == b ? 0UL : 1UL; 
} 

参照は、コンパイラは、数の大きさからタイプを推測します。この文章のリテラルセクションを参照してください。MSDN page

編集:私に指摘したように、この質問はそれを動作させる方法の答えを探していませんでした。私はまだリンクされているMSDNの記事にいくつかの価値があると信じています。それは、失敗したケースがなぜ機能していないのかを説明できる情報を提供しますが、他のものが成功する理由は説明しません。本当に面白い問題。

+2

問題は、それを動作させる方法ではなく、最初のケースがなぜそうでない場合に2番目のケースが機能するのかという質問です。 – juharr

+0

@juharrそうです。終わりに近づくと私の脳はここで揚げられています。リテラル部分はまだ正しく適用されますが?なぜそれがうまくいかないのか説明しますが、なぜ2番目のケースがそうしないのかを説明します。 –

2

int型の変数は暗黙的にulongに変換できません。int型は負の値を表すことができますが、ulongは暗黙的に変換できません。定数式の値が非負であれば、定数に暗黙的に変換されます。

2番目の例は定数式です。

関連する問題