次の式が同等かどうか疑問に思っています(C#の場合):
float x = ... ;
int y = ... ;
var result = (float) (x / y);
Versus:
var result = x / (float)y;
この特定のトピックについてもっと読むことができますか?
私が興味を持っているのは:
- これらは常に同じ結果を生み出しますか?
- 1つのオプションが他のオプションよりも効率的に実行されますか?
次の式が同等かどうか疑問に思っています(C#の場合):
float x = ... ;
int y = ... ;
var result = (float) (x / y);
Versus:
var result = x / (float)y;
この特定のトピックについてもっと読むことができますか?
私が興味を持っているのは:
はい、同じように動作します。実際、次のものを使用できます。
var result = x / y;
また
float result = x / y;
C#4仕様のセクション7.8.2は、使用可能な除算演算子を示しています。演算子はありませんfloat operator /(float, int)
。int
代わりに、C#コンパイラはからへの暗黙的な変換float
を使用し、float operator /(float, float)
演算子を使用します。
これは、通常の演算子の過負荷解決(仕様セクション7.3.4)と暗黙の数値変換(仕様セクション6.1.2)です。
疑問がある場合は、仕様を参照してください。さまざまなバージョンへのリンクが記載されたWebページがあります。C#5仕様はVS 2012にバンドルされていますが、現時点では個別にダウンロードすることはできません。
まったく違いはありません。結果のILコードは同じです。
IL逆アセンブラが両方のバリアントに対して返すものは次のとおりです。
// Code size 16 (0x10)
.maxstack 2
.locals init ([0] float32 x,
[1] int32 y,
[2] float32 result)
IL_0000: nop
IL_0001: ldc.r4 1.5
IL_0006: stloc.0
IL_0007: ldc.i4.1
IL_0008: stloc.1
IL_0009: ldloc.0
IL_000a: ldloc.1
IL_000b: conv.r4
IL_000c: div
IL_000d: conv.r4
IL_000e: stloc.2
IL_000f: ret