MyType<T>
最近 (おそらく設計上の欠点により)、修正されていない場所のコレクションT
(つまり、1 つのコレクション全体で複数のさまざまなジェネリックのインスタンス化)が必要な場合に、定期的なタスクに直面しました。
(そのような場合に)広く提案されているように、抽象クラスが宣言されました。
public abstract class MyType {}
public class MyType<T>: MyType {}
そして、私はのコレクションを持っていMyType
ます。ただし、このコレクションでは、どのタイプの要素も 1 つしか持たないという制約がありましたT
。
したがって、私は のカスタム実装を少し作成しましたICollection<TBase>
。Get<TParam>()
type に対応するアイテムを取得するメソッドをそこに含めたかったのTParam
です。後で次のように使用します。
MyCollection<MyType> collection = new MyCollection<MyType>();
MyType<int> myInt = collection.Get<int>();
しかし、私はそれを宣言することさえできないことを予期せず発見しました:
public TCustom<TParam> Get<TParam, TCustom<TParam>>() { } //this won't compile
内部ジェネリック (またはいわゆる「ジェネリックのジェネリック」) は、C# でも .NET でもサポートされていないためです (私は推測します)。そのような制限の背後に特定の理由があったとどう思いますか (複雑さを除く)?
UPDATE 1.コンパイラのバージョンとコンパイラのエラーについて尋ねました。
Microsoft C#、.NET 3.5 (Visual Studio 2010)。エラー:
エラー CS0081: 型パラメーターの宣言は、型ではなく識別子である必要があります
エラー CS0246: 型または名前空間名 'TCustom' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)
UPDATE 2.修正または説明が必要かどうかを尋ねられました。私は本当に理由を知りたいです。ただし、問題に対する適切な解決策がある場合は、大歓迎です。
更新 3.質問は、このブログ投稿で既に回答されている可能性があります。CLR チームは、言語を過度に複雑にしないようにという大きなプレッシャーにさらされていたようです。