我想知道以下表达式是否等效(在 C# 中):
float x = ... ;
int y = ... ;
var result = (float) (x / y);
Versus:
var result = x / (float)y;
我在哪里可以阅读有关此特定主题的更多信息?
我感兴趣的是:
- 这些总是会产生相同的结果吗?
- 一种选择是否比另一种更有效?
我想知道以下表达式是否等效(在 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)
运算符。相反,C# 编译器使用从int
to的隐式转换float
,并使用float operator /(float, float)
运算符。
这只是正常的运算符重载决议(规范第 7.3.4 节)和隐式数字转换(规范第 6.1.2 节)。
如有疑问,请参阅规范。我有一个包含不同版本链接的网页;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