今天回答別人問題的時候,才發現原先的T.default文法被取消了,使用了新的default關鍵字來實現這一功能。還好回複前動手試了一下,不然就...-_-b
下面詳細說明一下。之所以會用到default關鍵字,是因為需要在不知道型別參數為實值型別還是參考型別的情況下,為對象執行個體賦初值。考慮以下代碼:
class TestDefault<T>
{
public T foo()
{
T t = null; //???
return t;
}
}
如果我們用int型來綁定泛型參數,那麼T就是int型,那麼注釋的那一行就變成了 int t = null;顯然這是無意義的。為瞭解決這一問題,引入了default關鍵字:
class TestDefault<T>
{
public T foo()
{
return default(T);
}
}
以下是測試用的代碼,看了之後就應該很快能明白,default關鍵字的作用:
class Program
{
static void Main(string[] args)
{
TestDefault<int> t1 = new TestDefault<int>();
int i = t1.foo();
System.Diagnostics.Debug.Assert(i == 0);
TestDefault<object> t2 = new TestDefault<object>();
object o = t2.foo();
System.Diagnostics.Debug.Assert(o == null);
}
}
最後說明一下,在.net 2.0的早期preview中,沒有default關鍵字,使用如下的方式實現default關鍵字的功能:
class TestDefault<T>
{
public T foo()
{
return T.default;
}
}
這段代碼在vs 2005 beta1中,已經不能通過編譯了。