C#是一種強類型的語言,即變量必須先聲明類型才能夠使用,且變量的使用需要完全符合定義。也就是說,一旦一個變量被指定了數據類型,那么如果不經過類型轉換,它永遠都是這個數據類型。於此相對,弱類型語言是數據類型可以忽略的語言,一個變量可以賦予不同的數據類型的值。
C#支持隱式類型轉換:
1 static void Main(string[] args) 2 { 3 short a = 6; 4 int b = a; 5 }
但是如下代碼:
1 static void Main(string[] args) 2 { 3 int a = 6; 4 short b = a; 5 }
卻會報錯,提示:“錯誤 1 無法將類型“int”隱式轉換為“short”。存在一個顯式轉換(是否缺少強制轉換?) ”。
將int轉化為short是危險的,所以C#並不鼓勵程序員這樣做。
如果一定要這樣寫,可以改成顯式的類型轉換:
1 static void Main(string[] args) 2 { 3 int a = 6; 4 short b = (short)a; 5 }
不過作為程序員,應該留意這條語句可能帶來的問題。
接下來來看這樣一段程序:
1 static void Main(string[] args) 2 { 3 short a = 0xffff; 4 Console.WriteLine(a); 5 }
我們要做的是將0xffff(-1)賦給short型變量a,看似好像沒有任何問題,但編譯器提示:
錯誤 1 常量值“65535”無法轉換為“short”
原因是在C#中的十六進制常量默認是int型的,直接賦值給一個short型的變量顯然行不通。
那么如果我們加上顯式的類型轉換是否就可以了呢?
1 static void Main(string[] args) 2 { 3 short a = (short)0xffff; 4 Console.WriteLine(a); 5 }
編譯依舊不過,只是錯誤提示發生了變化:
錯誤 1 常量值“65535”無法轉換為“short”(使用“unchecked”語法重寫)
看來編譯器還是不允許我們這樣做,試一下unchecked重寫:
1 static void Main(string[] args) 2 { 3 unchecked 4 { 5 short a = (short)0xffff; 6 Console.WriteLine(a); 7 } 8 }
發現終於可以了!
unchecked語法的作用:用於取消整型算術運算和轉換的溢出檢查。
隨后發現C#對溢出有很嚴格的檢查,諸如:int a = 2147483647 * 2; 和 int a = 2147483647 + 1; 的語句正常情況都是不能通過編譯的,2147483647是int能表示的最大值。
而unchecked語法的存在又使得這些語句可以被執行,心中忽然覺得C#這門語言雖然很雜(支持超多關鍵字和語法),但是許多特性還是很實用的。
