2

列挙型の拡張メソッドがあります

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].
4

3 に答える 3

2

なぜそのエラーが発生するのかはわかりませんが、 aを返さないため、 の結果GetFlags<T>を aにキャストすることはできません。最も簡単な修正は次のとおりです。List<T>List<T>

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

それでも問題が解決しない場合は、新しいエラー メッセージをお知らせください。

または、イテレータ ブロックを使用するのではなく、GetFlags実際に を返すように変更することもできます。List<T>

于 2013-06-20T10:15:04.750 に答える
1

ここでの最初の問題は、シーケンスはリストとは異なるということです。リストが必要な場合は、リストを返すか、.ToList()afterを追加します。GetFlags()

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

IsFlagSetただし、より大きな問題は、その一般的なコンテキストでは使用できないことです。そのメソッドは任意の に対して定義されていませんT : struct

[Flags]個人的には、全体を通して列挙型として扱う方がよいと思います。単一の値ではなくリストを必要とする既存のコードがあると思いますか?

于 2013-06-20T10:24:46.243 に答える
0

GetFlagsIEnumerable<T>ではなく を返します。ここではキャストList<T>できません。

ただし、結果からリストを作成できるはずです。

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

ただし、エラーはここのコードと正確には一致しません。IEnumerable をキャストできないことを訴える必要がありますが、代わりに列挙型を示しています。これが正しいコードであると確信していますか?

于 2013-06-20T10:15:12.377 に答える