C#中的类型转换,我的错误在哪里

本文关键字:我的 错误 在哪里 类型转换 | 更新日期: 2023-09-27 18:36:37

我在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) 

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

C#中的类型转换,我的错误在哪里

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

要将数组转换为另一种类型,您可以执行以下操作:

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

请注意,如果对象不能转换为类型 T ,它将在运行时抛出InvalidCastException

C# 仅支持引用类型的数组协方差。因此,您必须将泛型参数 T 约束到类:

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

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