将集合(HashSet)隐式转换为IEnumerable <T>

Atr*_*gma 1 .net c# linq collections casting

我有一个简单的抽象枚举类:

public abstract class Enumeration<T> {

    protected readonly T _value;
    private static readonly HashSet<Enumeration<T>> _values
        = new HastSet<Enumeration<T>>();

    protected Enumeration(T value) {
        _value = value;
        _values.Add(this);
    }

}
Run Code Online (Sandbox Code Playgroud)

现在我想有一个方法返回HashSet中的每个元素,但不返回HashSet本身( - >作为IEnumerable).

但这不起作用:

public static IEnumerable<T> GetValues() {
     return _values;
}
Run Code Online (Sandbox Code Playgroud)

因为我无法隐含地转换HashSetIEnumerable<T>,当然.我能想到的唯一方法是循环遍历HashSet并产生每个元素,但我想知道是否有一种方法可以自动执行此操作,就像您隐式将列表转换为IEnumerable<T>.

SLa*_*aks 6

你可以隐式转换HashSet<T>IEnumerable<T>,因为HashSet就像ewvery其他泛型集合类型一样IEnumerable<T>.

但是,由于显而易见的原因,您无法转换HashSet<U>IEnumerable<T>,除非U可转换为T(在这种情况下您可以使用隐式协变转换).

HashSet是(但可能不应该)的集合Enumeration<T>,而不是T.