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

时间:2013-06-20 10:11:03

标签: 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(flag))
                yield return flag;
        }
    }

我试着得到这样的结果:

Zone_Status_ZoneConditionFlagEnum flags = (Zone_Status_ZoneConditionFlagEnum)flagsRaw;

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

但是我得到了

NX584(NX584Test)->Error parsing message: Cannot implicitly convert type [Digicom.NX584Engine.Messages.Zone_Status_ZoneConditionFlagEnum] to System.Collections.Generic.List`1[Digicom.NX584Engine.Messages.Zone_Status_ZoneConditionFlagEnum].

3 个答案:

答案 0 :(得分:2)

我不清楚为什么你会得到 错误 - 但你不能将GetFlags<T>的结果转换为List<T>,因为它不会返回List<T>。最简单的解决方案是:

var ZoneConditionFlags_List = flags.GetFlags().ToList();

如果 不起作用,请提供新的错误消息。

或者,您可以更改GetFlags,使其实际返回List<T>而不是使用迭代器块。

答案 1 :(得分:1)

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

var ZoneConditionFlags_List = flags.GetFlags().ToList();

然而,更大的问题是您不能在该通用上下文中使用IsFlagSet;该方法未针对任意T : struct定义。

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

答案 2 :(得分:0)

GetFlags会返回IEnumerable<T>,而不是List<T>,您无法投射

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

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

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