2012-03-15 74 views
0

SqlServer中我的一種數據類型是smallint,它映射到.NET中的shortInt16。我正在使用一個簡單的循環與我是一個整數,它告訴我,它不能隱式地轉換兩者之間?爲什麼不能將.Net從short轉換爲int?

我只是想知道爲什麼這是不可能的?這是否僅僅是爲了防止你使用大於短暫的數字?這對我來說似乎很奇怪,因爲我大約80%確定我從來不必將int轉換爲long

樣品:

public Int16 Test() 
{ 
    int i = 2; 
    return i; 
} 
+0

聽起來可疑,你可以張貼演示問題的代碼? – 2012-03-15 14:29:09

+0

因爲在CLR類型中'long'大於'int',所以不需要將'int'轉換爲'long'。 – 2012-03-15 14:37:32

回答

5

隱式從shortint應該存在,因爲你是從狹義要寬,寬窄不含蓄,因爲潛在丟失數據的支持。編譯器允許你忽略這個,但是在這些情況下請求你明確地陳述你已經理解了它的潛力並且你確定。

更新:

你的代碼是一個狹窄的演員和不能被隱式進行。修復:

public Int16 Test() 
{ 
    int i = 2; 
    return (Int16)i; 
} 

雖然,在這種特殊情況下,編譯器理論上可以知道不會發生數據丟失。對於其他99.99%的時間,它在編譯時無法知道這一點,因此只有在可能發生數據丟失的情況下才支持顯式轉換。

這明確地向開發人員承擔責任,使得當由於數據丟失而發生運行時錯誤時,開發人員必須事先有意識地做出該決定,並且沒有合法地位向計算機投擲咒語。

VB.NET似乎允許您使用選項嚴格規避這種限制:

http://msdn.microsoft.com/en-us/library/k1e94s7e(v=vs.80).aspx

所以我想這是一個C#具體的設計選擇。

+1

爲了搭載Adam在這裏所說的話,從一個較大的容器轉移到一個較小的容器可以保證數據的丟失。明確地轉換它會告訴編譯器,你知道這個事實並且是故意的。 – 2012-03-15 14:31:02

+0

@DJQuimby Ta,稍微修改了我的答案。 – 2012-03-15 14:32:47

+0

@AdamHouldsworth我知道如何解決它。問題是爲什麼 – ediblecode 2012-03-15 14:34:30

1

隱式轉換將僅在非收縮轉換(以防止數據丟失)進行。

+0

我們正在討論非縮減轉換(short - > int) – 2012-03-15 14:29:45

+0

@JakubKonecki其實我們正在談論int - > short – ediblecode 2012-03-15 14:32:25

+0

哈,如果只是問題從開始就是正確的...... ;-) – 2012-03-15 14:48:23

0

這取決於您使用的是哪種語言。

只要你不溢出你的Int16,VB就會默認轉換沒有問題。 如果啓用選項嚴格,你將不得不自己做轉換:Convert.ToInt16(yourInt32)

在C#中,你必須將它轉換:(Int16)yourInt32