1

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

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);
    }

}

现在我想要一个方法来返回 HashSet 中的每个元素,而不是 HashSet 本身( -> 作为 IEnumerable)。

但这不起作用:

public static IEnumerable<T> GetValues() {
     return _values;
}

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

4

2 回答 2

8

您可以隐式转换HashSet<T>IEnumerable<T>,因为 HashSet 与其他通用集合类型一样,实现IEnumerable<T>.

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

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

于 2013-07-26T13:10:02.087 回答
0
public static IEnumerable<T> GetValues()
{
    return _values.Select(e => e._value);
}
于 2013-07-26T13:12:59.903 回答