добавляет ли явное приведение дополнительные издержки, особенно для большого числа / массива чисел? или это то же самое, что и неявное приведение?
Вы можете обратиться к SharpLab , чтобы увидеть различия под капотом в IL. Как видите, логика c почти одинакова (за исключением типов, разумеется, потому что вы используете разные типы)
.method public hidebysig
instance float64 AutoCast () cil managed
{
.maxstack 8
IL_0000: ldc.i4.s 9
IL_0002: conv.r8
IL_0003: ret
} // end of method C::AutoCast
.method public hidebysig
instance int32 ManualCast () cil managed
{
.maxstack 8
IL_0000: ldc.r8 9.78
IL_0009: conv.i4
IL_000a: ret
} // end of method C::ManualCast
Или даже обратитесь к коду ASM
C.AutoCast()
L0000: sub esp, 0x8
L0003: vzeroupper
L0006: vmovsd xmm0, qword [0x14540488]
L000e: vmovsd [esp], xmm0
L0013: fld qword [esp]
L0016: add esp, 0x8
L0019: ret
C.ManualCast()
L0000: mov eax, 0x9
L0005: ret
Как видите, приведение double
к int
просто перемещает значение и возвращает неотъемлемую часть, int
к double
более сложное. В результате вы можете увидеть различные результаты тестов.
Конечно, это зависит от используемой CLR и версии. NET (есть много улучшений. NET Core и некоторое оборудование также были добавлены встроенные функции). Я запустил его, используя. NET Core и CoreCLR, в. NET Framework вы увидите разные результаты.
Вы можете проверить точное поведение вашей среды с помощью своего кода (по крайней мере, потому что вы задали вопрос для Academi c reason)