如何将对象数组转换为泛型类型数组

时间:2013-07-04 08:01:47

标签: c# generics

我正在尝试将对象数组转换为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。以下代码不起作用。

elements [numElements - 1] = null:

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

3 个答案:

答案 0 :(得分:3)

你不需要在这里演员。初始化具有容量的数组就足够了:

elements = new E[INITIAL_CAPACITY];

答案 1 :(得分: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();

答案 2 :(得分:0)

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

c#类具有&#39;默认关键字&#39;为你的泛型。因为某些类型可能不可为空。

var number = default(E);

例如,整数不能为空。