隱式類型變量 (Implicitly typed local variables)
象下面的代碼書寫就是隱式類型變量
var i = 5;
var str = “Csharp”
var numbers = new int[]{1,2,3};
var orders = new System.Collections.Hashtable();
var orders1 = new Dictionary();
var i = xxx ; 的作用就是用 xxx 的類型聲明為i的類型。並給i 賦值。
由於聲明時候,需要依賴於等號右邊的表達式,所以必須同時賦值。否則下面的書寫就會報錯誤: Error Implicitly typed locals must be initialized
var gg;
使用 Implicitly typed local variables 時應遵守下列約束:
1. The declarator must include an initializer
聲明時必須包含初始化器。
2、The initializer must be an expression. The initializer cannot be an object or collection initializer by itself, but it can be a new expression that includes an object or collection initializer.
初始化必須是一個表達式。初始化表達式不能包含它自身,但是可以是包含一個對象或集合初始化器的一個new表達式(即匿名類型)。
3、The compile-time type of the initializer expression cannot be the null type.
初始化器表達式的編譯期類型不可以是空(null)類型。
比如:
var gg = null; 這行代碼就會報錯誤: Cannot assign '' to an implicitly typed local
4、If the local variable declaration includes multiple declarators, the initializers must all have the same compile-time type.
如果局部變量聲明包含了多個聲明符,這些聲明符必須具備同樣的編譯期類型。
比如如下代碼:
var n = "java"
var m = 4;
var ff = m + n;
Console.WriteLine(ff);
Console.WriteLine(ff.GetType());
打印出來的信息會是:
4java
System.String
5. The initializer cannot refer to itself. (初始化中不能提起它自身)
隱式類型變量的使用范圍,它可不是到處能用。僅僅可以用於下面四種情況
1. 局部變量聲明
2. for 語句中變量聲明)
3. using 語句初始化變量時.
4. foreach 中iterator類型聲明)
比如下面代碼就會報錯:
class Program
{
private var tmp = "java"
}
The contextual keyword 'var' may only appear within a local variable declaration
隱式類型變量實際是編譯器干的活(編譯器局部變量的類型從初始化它們的表達式推導而來),所以
var i = 5; 這樣的代碼,編譯後用 Reflector 再反編譯看到的是:
int i = 5;
匿名類型(Anonymous Types)
匿名類型,是從對象初始化器自動推導和創建的元組(tuple)類型。
var o = new {Name = "Hello", Age = 23 };
var intArr = new[] {3,1,4,1,5} ;
就是 匿名類型的一種書寫。
注意:
var intArr = new[] {3,1,4,1,5} ; 是匿名類型,當然也是 隱式類型變量
var intArr = new int[] {3,1,4,1,5} ; 是隱式類型變量
匿名類型 和 隱式類型變量 的區別
隱式類型變量 指我們可以通過等號右邊的表達式,推斷出等號左邊該是那種類型。
匿名類型則是指,根據這個類型的初始化函數,我們可以推導出和創建出這個類型的實例。
這兩個特性很多時候是一起作用的。
比如: new {Name = "Hello", Age = 23 }這個表達式的類型是匿名的,因此o就會變成那個匿名類型。
其中的 Name = "Hello" 又可以看作是 隱式類型變量。
不過應該沒有人會用var i = 10;這樣看起來像jscript的語法,所以var基本上就是為匿名類型而生 .
說明:
以上信息都是基於 Orcas Beta 1 的。也許正式版的時候,會發生變化。