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:

ここで使用する正しい 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 に答える