在C#中键入转换,我的错误在哪里?

时间:2012-06-09 21:06:08

标签: c# data-structures

我在Java上“长大”,最近完全切换到了C#。我只是在教自己ATM,然后回去,现在使用C#重新编写Java中的所有旧编程作业。这是一段特殊的代码,我试图使用泛型并实例化堆栈数组。

stack = (T[])(new object[def_cap]);

给了我这个编译错误

Cannot convert type 'object[]' to 'T[]' (CS0030) 
Cannot implicitly convert type 'object[]' to 'T[]' (CS0029) 

我认为演员操作符在C#中的工作方式与在Java中的工作方式不同,并且想知道是否有人可以启发我。谢谢!

3 个答案:

答案 0 :(得分:3)

只需使用stack = new T[def_cap];即可。您已经拥有该类型,并且可以直接使用它。

答案 1 :(得分:1)

要将数组转换为其他类型,您可以执行以下操作:

object[] objArr = new object[10];
T[] tArr = objArr.Cast<T>().ToArray();

请注意,如果无法将对象转换为T类型,则会在运行时抛出InvalidCastException

答案 2 :(得分:1)

C#仅支持array covariance作为参考类型。因此,您必须将通用参数T约束到类:

    public static void Foo<T>() where T:class
    {
        T[] stack = (T[])(new object[def_cap]);
    }

但是在你的情况下,你将object []转换为T [],你将在运行时获得InvalidCastException,除非T是System.Object,因为只有当Y是the时,数组协方差才能将X []强制转换为Y []与X相同的类型,或者X是从Y派生的类(但如果Y是从X派生的,则不是)。