我在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中的工作方式不同,并且想知道是否有人可以启发我。谢谢!
答案 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派生的,则不是)。