2012-09-28 135 views
2

我想知道如果下面的表達式是相同的(在C#):C#:(float)(x/y)和x /(float)y之間是否有區別?

float x = ... ; 
int y = ... ; 

var result = (float) (x/y); 

Versus: 

var result = x/(float)y; 

我在哪裏可以閱讀更多關於這個特定的主題?

我所感興趣的是:

  1. 將這些總是產生相同的結果?
  2. 一個選項比另一個更有效嗎?
+8

我聽說有一位作者寫了一本關於C#的書。 –

+0

你可以閱讀更多的MSDN和C#規範。 –

+0

有沒有有用的答案?如果是這樣,請隨時接受。 –

回答

9

是的,他們的行爲方式相同。事實上,你可以使用:的C#4規格顯示哪些部門運營商繳費

var result = x/y; 

float result = x/y; 

第7.8.2節 - 而且也沒有float operator /(float, int)運營商。相反,C#編譯器使用從intfloat的隱式轉換,並使用float operator /(float, float)運算符。

這只是正常的運算符重載分辨率(規範第7.3.4節)和隱式數值轉換(規範第6.1.2節)。

如有疑問,請參閱規格。我有一個web page with links to the different versions; C#5規範與VS 2012捆綁在一起,但目前沒有單獨下載。

+0

隱式轉換(方法調用?)與鑄造(我不知道但可能涉及方法調用?)之間有任何顯着不同嗎? –

+0

@ lysergic-acid:不,這裏沒有方法調用。這只是隱式轉換和顯式轉換之間的區別,這只是源代碼的一個問題(因爲它們在兩種情況下都是相同的轉換)。 –

7

根本沒有區別。生成的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 
相關問題