0

私は 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) 

C# と Java ではキャスト演算子の動作が異なると思いますが、誰かが私を啓発できるかどうか疑問に思っていました。ありがとうございました!

4

3 に答える 3

3

stack = new T[def_cap];代わりに使用してください。あなたはすでに型を持っていて、それを直接使うことができます。

于 2012-06-09T21:08:31.823 に答える
1

C# は、参照型の配列共分散のみをサポートします。したがって、ジェネリック パラメーター T をクラスに制約する必要があります。

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

ただし、object[] を T[] にキャストする場合、T が System.Object でない限り、実行時に InvalidCastException が発生します。これは、配列の共分散が X[] を Y[] にキャストできるのは、Y が Y と同じ型である場合に限られるためです。 X または X が Y から派生したクラスの場合 (ただし、Y が X から派生した場合は除く)。

于 2012-06-09T21:30:34.130 に答える
1

配列を別の型に変換するには、次のようにします。

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

オブジェクトを type にキャストできない場合は、実行時Tにスローされることに注意してください。InvalidCastException

于 2012-06-09T21:12:35.083 に答える