Это не будет работать, потому что все экземпляры MyClass
, являющиеся IMyClass
, не означают автоматически, что все экземпляры HashSet<MyClass>
также HashSet<IMyClass>
. Если бы это сработало, вы могли бы:
ICollection<IMyClass> h = new HashSet<MyClass>();
h.Add(new OtherClassThatImplementsIMyClass()); // BOOM!
Технически, это не работает, потому что дженерики C # (<= 3.0) инвариантны. C # 4.0 вводит безопасную ковариацию, которая также не помогает в этом случае. Это, однако, помогает, когда интерфейсы используют параметры типа только на входе или только на выходных позициях. Например, вы сможете передать <code>HashSet<MyClass> как IEnumerable<IMyClass>
какому-либо методу.
Кстати, они являются более легким обходным путем, чем заполнение вручную другого HashSet
, например:
var newSet = new HashSet<IMyClass>(originalSet);
или вы можете использовать метод Cast
, если хотите привести набор к IEnumerable<IMyClass>
:
IEnumerable<IMyClass> sequence = set.Cast<IMyClass>(set);