2011-03-05 127 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

相关问题