5

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 チームは、言語を過度に複雑にしないようにという大きなプレッシャーにさらされていたようです。

4

2 に答える 2

1

この場合、非ジェネリック ディクショナリでデータを単純に非表示にすることができます。

private Dictionary<Type, object> _Data;

そしてあなたのGet方法:

public MyType<TParam> Get<TParam>()
{ 
    return (MyType<TParam>)_Data[typeof(TParam)];
}

タイプが関連していない場合、TParamとにかくタイプセーフを提供する共通のデータ構造はありません。

于 2011-10-07T10:19:31.937 に答える
0

なぜ正確に必要なのですか

public TCustom<TParam> Get<TParam, TCustom<TParam>>() { } 

ジェネリック型(あなたの場合は MyType )がわかっている場合は、できませんか

public MyType<TParam> Get<TParam>() { 
  return (MyType<TParam>)_items.FirstOrDefault(i => i is MyType<TParam>);
}

または、何か不足していますか?

于 2011-10-07T09:33:29.943 に答える