C#具有隱式類型聲明描述
本文向大家介紹C#具有隱式類型聲明,可能好多人還不知道隱式類型聲明,沒有關(guān)系,看完本文你肯定有不少收獲,希望本文能教會你更多東西。
C#具有隱式類型聲明
在一個帶有初始化器的聲明語句中,待聲明的變量的類型是顯而易見的——和初始化表達式的結(jié)果類型一致。對于這種情況,在C# 3.0中可以使用新增的關(guān)鍵字var來代替聲明中的類型,而由編譯器根據(jù)初始化表達式來推斷出變量的類型。
- var i = 5; // int
- var d = 9.0; // double
- var s = "Hello"; // string
- var a = new int[] { 1, 2, 3, 4, 5 }; // int[]
- Console.WriteLine("Type of variable <i>: {0}", i.GetType());
- Console.WriteLine("Type of variable <d>: {0}", d.GetType());
- Console.WriteLine("Type of variable <s>: {0}", s.GetType());
- Console.WriteLine("Type of variable <a>: {0}", a.GetType());
上面的代碼在C# 3.0中是符合語法規(guī)則的,前四行代碼就是使用了隱式類型的聲明;而后四行代碼用于在運行時驗證各個變量是否擁有正確的類型。如果在Visual Studio 2005中運行這段代碼(為了能夠看到結(jié)果,請使用Ctrl+F5來編譯并啟動程序),會得到下面的結(jié)果:
- Type of variable <i>: System.Int32
- Type of variable <d>: System.Double
- Type of variable <s>: System.String
- Type of variable <a>: System.Int32[]
這表明,編譯器在編譯的時候,已經(jīng)正確地推斷了每個變量的類型,并將其嵌入到了程序集的元數(shù)據(jù)中。
這里有兩個限制,一是C#具有隱式類型聲明只能作用在局部變量上,二是這種聲明必須有初始化器(即等號和后面的表達式)。如果我們企圖在一個類中聲明一個具有隱式類型的域,就會出現(xiàn)一個編譯錯誤:Invalid token ’var’ in class, struct, or interface member declaration;而如果聲明中沒有出現(xiàn)初始化器,則會導致另外一個編譯錯誤:’=’ expected。
除了局部變量外,作用域為一個塊的數(shù)組也可以運用C#具有隱式類型聲明,例如:
- var ia = new [] { 1, 2, 3, 4, 5 }; // int[]
- var da = new [] { 1.1, 2, 3, 4, 5 }; // double[]
- var sa = new [] { "Hello", "World" }; // string[]
- Console.WriteLine("Type of array <ia>: {0}", ia.GetType());
- Console.WriteLine("Type of array <da>: {0}", da.GetType());
- Console.WriteLine("Type of array <sa>: {0}", sa.GetType());
在上面例子的數(shù)組聲明中,在運算符new和表示數(shù)組聲明的一對方括號之間省略了類型名字,但這在C# 3.0中仍然是符合語法規(guī)則的。編譯器會通過成員列表中的值的類型來推斷數(shù)組的類型。編譯并運行上面的例子,會得到如下的輸出:
- Type of array <ia>: System.Int32[]
- Type of array <da>: System.Double[]
- Type of array <sa>: System.String[]
除了和具有隱式類型的局部變量具有相同的約束外,具有隱式類型的數(shù)組還有必須尊從這樣一個規(guī)則,即成員列表中的所有值必須是兼容的。也就是說,成員列表中必須存在這樣一個值,使得其他值可以隱式地轉(zhuǎn)換為該值的類型。因此,下面的聲明是不符合語法規(guī)則的:
- var aa = new [] { 1, "Hello", 2.0, "World" };
如果試圖編譯上面的代碼,會得到一個編譯錯誤:No array type can be inferred from the initializers。這是因為編譯器無法根據(jù)成員列表中的值來推斷數(shù)組的類型。
實際上,盡管C#具有隱式類型聲明使得傳統(tǒng)聲明的編寫方法更加便利,然而引入這種聲明方式的真正目的并不在于此,而是為了使局部變量和數(shù)組能夠訪問這樣一個新的語言構(gòu)造:匿名類型。
【編輯推薦】