2011-03-05 156 views
3

這可能是一個基本問題,但爲什麼在將值類型列表傳遞到泛型方法時,我無法將泛型類型轉換回原始類型?爲什麼我不能將泛型類型轉換爲值類型

IList<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 }; 
Inverse<int>(list); 

    public void Inverse<T>(IList<T> list) 
     { 
      for (i = 0; i <= list.Count/2; i++) 
      { 
       int a = list[i] as Int16; //=> does not work 
       int b = (int)list[i]; //=> does not work either 

      } 
     } 

回答

6

我不期望它會出現,因爲您假設IList中的類型是'int',所以您完全錯過了這個泛型方法的要點。

如果你做的事:

T a = (T)list[i]

然後它會工作。

2

好,因爲有對T沒有限制,第二個錯誤是防止類似

Inverse<Person>(new List<Person>()); 

,作爲第一個錯誤,as僅適用於引用類型,並再次因爲T沒有約束,編譯器不能推斷任何東西。

0

您不能使用Int16,因爲您正嘗試轉換對象引用,但Int16(簡稱)是值類型。但是你的設計也忽略了泛型的一點:你期待一個整數,但使用一個通用的方法,所以T可能真的是任何東西。

1

你做錯了。逆接受任何類型的T,而不僅僅是int。以T替換爲int的發生

1
int b = Convert.ToInt32(list[i]); 

,而不是

int b = (int)list[i]; 

這是因爲編譯器不知道它是什麼類型&因此拋出就可以了編譯器錯誤。我不確定,如果它在c#4中有效,並且帶有類型推斷。

編輯:http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx

:因爲

as運算符是用來之間 兼容參考執行 某些類型的轉換類型

參考as語句不能在您的示例工作

+0

我wouldnt推薦轉換。在這種情況下,它將在對象上調用ToString,然後解析它。而你不知道T可以藏起來。 – Euphoric 2011-03-05 22:41:00

相關問題