2017-09-04 6 views
3

IDictionary<List<IInterface>, HashSet<IInterface>>を定義する方法を探していますので、各キーと値のペアに対して、IInterfaceを実装する型は同じです。コンパイル時に、辞書エントリ型のインタフェースでの正確性のチェック

T1T2の2種類があり、IInterfaceを実装しています。

そして、種類

  1. List<T1>HashSet<T1>
  2. List<T2>HashSet<T2>

のキーと値のペアを追加することが可能でなければなりませんが、キーを追加することが可能にすべきではありません値のタイプのペア

  1. List<T1>およびHashSet<T2>
  2. List<T2>およびHashSet<T1>である。

それは私がコンパイルエラーが出るように、私は禁じられたキーと値のペアを追加しようとするたびに、このような辞書を定義することは可能ですか?はいの場合、どうですか?

私は1つまたはいくつかの新しいクラス、インターフェイスなどが必要かどうか気にしません。私はそれが原則として可能かどうかを知りたがっています。

答えて

3

新しいクラスやインターフェイスなどが必要な場合は気にしません。

この場合はほとんど可能です!型セーフなディクショナリは、型セーフなアクセスのみを提供するクラスでラップすることができます。

public class MyDictionary { 
    private readonly Dictionary<object, object> _innerDictionary = new Dictionary<object, object>(); 
    public void Add<T>(List<T> key, HashSet<T> value) where T : IInterface { 
     _innerDictionary.Add(key, value); 
    } 
    public HashSet<T> Get<T>(List<T> key) where T : IInterface { 
     return (HashSet<T>)_innerDictionary[key]; 
    } 
    public void Set<T>(List<T> key, HashSet<T> value) where T : IInterface { 
     _innerDictionary[key] = value; 
    } 
    // etc. 
} 

List<ConcreteImplementation>にかかわらずConcreteImplementationIInterfaceを実装して、あなたがIDictionary<List<IInterface>, HashSet<IInterface>>インターフェイスをこのように実装することができないかどうかの、List<IInterface>に変換できないことに注意してください。

関連する問題