为什么我不能将泛型类型转换为值类型

时间:2011-03-05 16:18:25

标签: c# generics

这可能是一个基本问题,但为什么在将值类型列表传递给泛型方法时,我不能将泛型类型转换回原始类型?

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

            }
         }

5 个答案:

答案 0 :(得分:6)

我希望它不会,你完全错过了泛型方法,因为你假设IList中的类型是'int'。

如果你这样做了:

T a = (T)list[i]

然后它会起作用。

答案 1 :(得分:2)

好吧,因为对T没有约束,第二个错误是阻止类似

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

对于第一个错误,as仅适用于引用类型,并且由于T没有约束,编译器无法推断任何内容。

答案 2 :(得分:1)

你做错了。反接受任何类型的T,而不仅仅是int。用T

替换int的出现

答案 3 :(得分:1)

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

而不是

int b = (int)list[i];

那是因为编译器不知道它是什么类型&amp;因此会抛出编译器错误。我不确定,如果它在c#4中有效,可以进行类型推断。

编辑:as语句无法在您的示例中使用,因为

  

as运算符用于执行   某些类型的转换   兼容的参考类型

参考:http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx

答案 4 :(得分:0)

您无法使用Int16,因为您正在尝试强制转换对象引用,但Int16(短)是值类型。但是你的设计也忽略了泛型:你期望一个整数但是使用泛型方法,所以T真的可以是任何东西。

相关问题