C# 将集合(哈希集)隐式转换为IEnumerable<;T>;

C# 将集合(哈希集)隐式转换为IEnumerable<;T>;,c#,.net,linq,collections,casting,C#,.net,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 val

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

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

}
公共抽象类枚举{
受保护的只读T_值;
私有静态只读哈希集\u值
=新HastSet();
受保护枚举(T值){
_价值=价值;
_加上(这个);
}
}
现在我想要一个方法,它返回HashSet中的每个元素,而不是HashSet本身(->作为IEnumerable)

但这不起作用:

public static IEnumerable<T> GetValues() {
     return _values;
}
公共静态IEnumerable GetValues(){
返回_值;
}

当然,因为我不能隐式地将
HashSet
转换为
IEnumerable
。我能想到的唯一方法是循环遍历HashSet并生成每个元素,但我想知道是否有一种方法可以自动做到这一点,比如当您将列表隐式地强制转换为
IEnumerable
时,您可以隐式地将
HashSet
转换为
IEnumerable
,因为HashSet,与EW所有其他泛型集合类型一样,实现了
IEnumerable

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


您的
HashSet
是(但可能不应该是)一个
枚举的集合,而不是
T

您可以隐式地将
HashSet
转换为
IEnumerable
,因为HashSet与EW任何其他泛型集合类型一样,实现了
IEnumerable

public static IEnumerable<T> GetValues()
{
    return _values.Select(e => e._value);
}
但是,由于明显的原因,您无法将
HashSet
转换为
IEnumerable
,除非
U
可转换为
T
(在这种情况下,您可以使用隐式协变转换)

您的
HashSet
是(但可能不应该是)
枚举的集合,而不是
T

公共静态IEnumerable GetValues()
public static IEnumerable<T> GetValues()
{
    return _values.Select(e => e._value);
}
{ 返回_值。选择(e=>e._值); }
公共静态IEnumerable GetValues()
{
返回_值。选择(e=>e._值);
}

您可以使用hashset.AsEnumerable()执行
。但我不是100%确定,但它可以提供由hashsetHashSet删除的重复项HashSet是可枚举的。你到底有什么问题?为什么要将
this
添加到hashset
\u值中。添加(this)?@wudzik哇。我的错!我尝试使用AsEnumerable(),但没有成功,因为我无法将IEnumerable转换为IEnumerable-结果我不得不更改返回值。显然,我需要睡觉/@lazyberezovsky,因为它是一个枚举,我不想使用反射来获取所有定义的字段您可以使用hashset.AsEnumerable()执行
\u操作。但我不是100%确定,但它可以提供由hashsetHashSet删除的重复项HashSet是可枚举的。你到底有什么问题?为什么要将
this
添加到hashset
\u值中。添加(this)?@wudzik哇。我的错!我尝试使用AsEnumerable(),但没有成功,因为我无法将IEnumerable转换为IEnumerable-结果我不得不更改返回值。显然,我需要睡觉/@lazyberezovsky,因为它是一个枚举,我不想使用反射来获取所有定义的字段