Ilya Ivanov のヒントを得て、小さなサンプル プログラムの IL コードを調べました。
Ilya は x が整数であると仮定しました。これが事実である場合、変換に関する彼のコメント (conv.r8) は完全に正しいです。しかし、私が念頭に置いていたのは、double 型の変数を double リテラルと比較する場合です。
この場合、型サフィックスは違いますか?
答えはノーだ!
(d == 0) または (d == 0d) を比較して、この小さなプログラムを見てみましょう。
static void Main(string[] args)
{
double d = 0.0;
if (d == 0) // if (d == 0d)
d = 1.23;
Console.WriteLine(d);
}
どちらのバージョンもまったく同じ IL コードにコンパイルされます。
.method private hidebysig static
void Main (
string[] args
) cil managed
{
// Method begins at RVA 0x2050
// Code size 48 (0x30)
.maxstack 2
.entrypoint
.locals init (
[0] float64 d,
[1] bool CS$4$0000
)
IL_0000: nop
IL_0001: ldc.r8 0.0
IL_000a: stloc.0
IL_000b: ldloc.0
IL_000c: ldc.r8 0.0
IL_0015: ceq
IL_0017: ldc.i4.0
IL_0018: ceq
IL_001a: stloc.1
IL_001b: ldloc.1
IL_001c: brtrue.s IL_0028
IL_001e: ldc.r8 1.23
IL_0027: stloc.0
IL_0028: ldloc.0
IL_0029: call void [mscorlib]System.Console::WriteLine(float64)
IL_002e: nop
IL_002f: ret
} // end of method Program::Main
もちろん、アセンブラコードも同じです。
したがって、0.0 または 0d の代わりに 0 を書き込むことは問題ありません...