C# 无法使用扩展方法隐式转换类型

C# 无法使用扩展方法隐式转换类型,c#,casting,C#,Casting,我有一个枚举的扩展方法 public static IEnumerable<T> GetFlags<T>(this T value) where T : struct { CheckIsEnum<T>(true); foreach (T flag in Enum.GetValues(typeof(T)).Cast<T>()) { if (value.IsFlagSet(

我有一个枚举的扩展方法

public static IEnumerable<T> GetFlags<T>(this T value) where T : struct
    {
        CheckIsEnum<T>(true);
        foreach (T flag in Enum.GetValues(typeof(T)).Cast<T>())
        {
            if (value.IsFlagSet(flag))
                yield return flag;
        }
    }

我不清楚为什么会出现这个错误-但是您不能将
GetFlags
的结果强制转换为
列表
,因为它不会返回
列表
。最简单的解决方法是:

var ZoneConditionFlags_List = flags.GetFlags().ToList();
如果不起作用,请给出新的错误消息


或者,您可以更改
GetFlags
,使其实际返回一个
列表,而不是使用迭代器块。

GetFlags
返回一个
IEnumerable
,而不是
列表,您不能在此处强制转换

但是,您应该能够根据结果构建一个列表:

List<Zone_Status_ZoneConditionFlagEnum> ZoneConditionFlags_List = flags.GetFlags().ToList();
List ZoneConditionFlags\u List=flags.GetFlags().ToList();

但是,该错误与此处的代码不完全匹配,它应该抱怨IEnumerable无法强制转换,而是表示枚举类型。你确定这是正确的代码吗?

这里的第一个问题是序列不同于列表;如果需要列表,请返回列表,或在
GetFlags()
之后添加
.ToList()
,即

var ZoneConditionFlags_List = flags.GetFlags().ToList();
然而,更大的问题是,您不能在通用上下文中使用
IsFlagSet
;没有为任意
T:struct
定义该方法

就个人而言,我认为您最好将其作为一个
[Flags]
枚举处理;我假设您有需要列表而不是单个值的现有代码

List<Zone_Status_ZoneConditionFlagEnum> ZoneConditionFlags_List = flags.GetFlags().ToList();
var ZoneConditionFlags_List = flags.GetFlags().ToList();