3

インターフェイスを使用して Dynamic T を作成する必要があります。しかし、「Type Casting」エラーが発生します。これが私のコードです:

interface IEditor { }

class Editor : IEditor { }

class Test<T> { }

これで動的になるので、以下のコードを使用しています:

Test<IEditor> lstTest = (Test<IEditor>)Activator.CreateInstance(typeof(Test<>).MakeGenericType(typeof(Editor)));

次のエラーが表示されます

タイプ 'CSharp_T.Test`1[CSharp_T.Editor]' のオブジェクトをタイプ 'CSharp_T.Test`1[CSharp_T.IEditor]' にキャストできません。

このエラーはコンパイル エラーではありませんが、実行時エラーが発生しています。

4

2 に答える 2

6

ジェネリック クラスは共分散をサポートしていませんが、インターフェイスはサポートしています。このようにインターフェイスを定義してパラメーターとしてITest<>マークすると、Tout

interface IEditor { }

class Editor : IEditor { }

interface ITest<out T> { }

class Test<T> : ITest<T> { }

あなたはこれを行うことができます:

ITest<IEditor> lstTest = (ITest<IEditor>)Activator
    .CreateInstance(typeof(Test<>)
    .MakeGenericType(typeof(Editor)));

ただし、これにより、Tパラメーターを内部で使用できる方法ITest<>とその実装が制限されます。

ideone のデモ

于 2013-09-20T20:15:10.943 に答える
1

Testは共変ではありません (一般的な引数では不変です)。このため、 aTest<IEditor>は a のサブタイプではありませんTest<IEditor>。これらの 2 つのタイプの間に関係はありません。

Test<IEditor>の代わりに、型のオブジェクトを作成してTest<IEditor>から、キャストを成功させることができます。

于 2013-09-20T20:09:29.140 に答える