1

我正在尝试将对象数组转换为 CSharp 中的通用对象数组,不断收到此编译器错误。有任何想法吗?

谢谢

 private const int INITIAL_CAPACITY = 20;
    protected int numElements;
    protected E[] elements;

    /*
     * default constructor that creates a new set
     * that is initially empty
     * */
    public ArraySet()
    {
        numElements = 0;
        elements = (E[])(new Object[INITIAL_CAPACITY]);// unchecked
    }

谢谢大家,另一个相关问题,我想将特定元素设置为null。以下代码不起作用。

元素[numElements - 1] = null:

那么我们应该在这里使用什么正确的空值。感谢

4

3 回答 3

3

PLB 的回答指出了为什么你不需要这样做,我会插话你为什么不能这样做。

假设您有一个对象数组:

var objectArray = new object[] { 3, 5, 3.3, "test" };

现在你会怎么说我将它转换为统一的通用类型?不能保证对象数组中的所有实例都是相同类型的,数组可能是异构的,所以:

public static T[] ConvertTo<T>(object[] arr)
{
    return (T[])arr;
}

var intArray = ConvertTo<int>(objectArray);

不能真正工作:Cannot convert type 'object[]' to 'T[]'ConvertTo方法中。

在这种情况下你可以做的是测试每一个项目,如果它是适当的类型,特别是因为 LINQ 已经有合适的方法:

var intArray = objectArray.OfType<int>().ToArray();

这会给你一个数组:[3, 5]

所以通用版本是:elementsArray = objectArray.OfType<E>().ToArray();

于 2013-07-04T08:13:23.683 回答
3

你不需要在这里投射。用容量初始化数组就足够了:

elements = new E[INITIAL_CAPACITY];
于 2013-07-04T08:04:02.557 回答
0

elements[numElements - 1] = null: 那么我们应该在这里使用什么正确的 null 值。感谢

c# 类具有泛型的“默认关键字”。因为某些类型可能不能为空。

var number = default(E);

例如整数不能为空。

于 2017-06-28T10:44:36.870 回答