2013-03-29 107 views
1

我剛剛發現這一點:爲什麼不簡單的算術工作沒有鑄造?

ushort i = 4; 
i = i + 4; 

給出了一個編譯器錯誤:

Cannot implicitly convert type 'int' to 'ushort'. An explicit conversion exists (are you missing a cast?)

我不得不這樣來解決它:

ushort i = 4; 
i = (ushort)(i + 4); 

這背後的原因是什麼?它不應該是明顯易用的所有數據類型?

+0

我投票結束 - 不知道問題的關鍵是什麼... – code4life

+0

添加一個短和一個短的產生一個int。做一些搜索,找到相關的問題。對於咯咯笑,試試'i + = 4;'。 –

+0

我敢肯定,這是一個重複的問題。 –

回答

3

原因是因爲ushort + ushort實際返回一個int。請查看this thread以瞭解更多細節。

+0

感謝這個線程,這句話「因爲這個標準是這麼說的」爲我清除了它,因爲你可以說int + int是一個長整數。 –

6

字面4int,所以i + 4int此外,i被提升到int。這個加法的結果也是int,所以你不能將它分配給沒有轉換的ushort,因爲C#不允許隱式轉換爲更小幅度的數字類型。

+0

「int」也沒有數據丟失的可能性嗎?爲什麼'Int32'不會升級到'Int64'? –

+0

因爲在做這些決定的舊時代,int32是默認的int值,以及新的有光澤的32位處理器。 Int64相對較新,只在64位架構上本機支持。 – Davio

+0

@BartFriederichs - 這不是真的關於數據丟失,它只是'ushort'是一個比'int'小的類型,所以轉換必須明確,我已經編輯了答案,以使它更清晰。 – Lee

0

它因爲編譯器將4視爲integer。從較高到較低數據類型的轉換需要顯式轉換。

+0

如果編譯器簡單地將4作爲int處理,那麼'ushort x = 4;'不會編譯 - 但它確實如此。 –

+0

該語句本身很明顯,值正被分配給一個簡短的數據類型。嘗試一個值更大的ushort.MAX_VALUE !!! –

0

按照C#語言標準,具體地§2.4.4.2上整數常量:

類型字面如下確定的整數:

如果文字沒有後綴,它具有第一這些類型的值可以表示爲:int,uint,long,ulong。 如果文字後綴爲U或u,則它具有可以表示其值的第一個類型:uint,ulong。 如果文字後綴L或l,則它具有可以表示其值的第一個類型:long,ulong。 如果文字後綴爲UL,UL,UL,UL,LU,Lu,IU或Lu,則它屬於ulong類型。

因此,你的號碼被視爲一個整數,這就是爲什麼。

0

+ -operatior爲整數類型僅定義對intuintlong,和ulong之間。爲了計算i+4第一i必須從ushort通過隱式數值轉換轉換爲int,結果是相同的類型 - 也int所以的i+4類型實際上int是。由於不存在允許將int分配給定義爲ushort的變量的隱式轉換,編譯器會爲您提供i = i + 4的錯誤。

請注意,您仍然可以使用下面的,因爲+=涉及隱式轉換:

i += 4; 
0

我認爲最主要的,從評論帶走是INT32是使用只是「默認」類型由當天的共同建築。我不知道當前處理器支持更小整數類型的本地支持,但即使它是一個ushort,如果所有內容仍然由編譯器在水中轉換爲int32,我也不會感到驚訝。

所以(u)short更像是程序員的驗證約束,而不是內存保護程序。即使它是一個內存節省器,如果需要更多的CPU週期來轉換回到ushorts,我也不會感到驚訝。

+0

我使用'checked'關鍵字將它用作驗證約束。 –

+0

當然這很好。我的觀點是,如果你想節省內存或CPU週期,你不應該使用它,這是錯過了重點。您使用它的原因沒有任何問題。如果你正在編寫一個API或類似的東西,只需使用int,這是開發人員所期望的。 – Davio

相關問題