0

我在 Java 上“长大”,最近完全转向 C#。我只是在自学 ATM,然后回去重做我现在使用 C# 用 Ja​​va 编写的所有旧编程任务。这是我尝试使用泛型并实例化堆栈数组的特定代码行。

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

这给了我这个编译器错误

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

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

4

3 回答 3

3

改用就好stack = new T[def_cap];了。您已经拥有该类型并且可以直接使用它。

于 2012-06-09T21:08:31.823 回答
1

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

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

请注意,如果无法将对象强制转换为 type T,它将InvalidCastException在运行时抛出。

于 2012-06-09T21:12:35.083 回答
1

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 派生的)。

于 2012-06-09T21:30:34.130 回答