19

このコードを修正するのを手伝ってくれませんか

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;

namespace NTSoftHRM
{

    // ------------------------------------------------------------------------
    public class EnumValueList<T> : IEnumerable<T>
    {

        // ----------------------------------------------------------------------
        public EnumValueList()
        {
            IEnumerable<T> enumValues = GetEnumValues();
            foreach ( T enumValue in enumValues )
            {
                enumItems.Add( enumValue );
            }
        } // EnumValueList

        // ----------------------------------------------------------------------
        protected Type EnumType
        {
            get { return typeof( T ); }
        } // EnumType

        // ----------------------------------------------------------------------
        public IEnumerator<T> GetEnumerator()
        {
            return enumItems.GetEnumerator();
           // return ((IEnumerable<T>)enumItems).GetEnumerator();

        } // GetEnumerator

        // ----------------------------------------------------------------------
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        } // GetEnumerator

        // ----------------------------------------------------------------------
        // no Enum.GetValues() in Silverlight
        private IEnumerable<T> GetEnumValues()
        {
            List<T> enumValue = new List<T>();

            Type enumType = EnumType;

            return Enum.GetValues(enumType);

        } // GetEnumValues

        // ----------------------------------------------------------------------
        // members
        private readonly List<T> enumItems = new List<T>();

    } // class EnumValueList

} 

ビルド時のエラー: 型 'System.Array' を 'System.Collections.Generic.IEnumerable' に暗黙的に変換できません。return Enum.GetValues(enumType) に明示的な変換が存在します (キャストがありませんか?)

4

3 に答える 3

55

問題はGetEnumValuesメソッドにあり、Enum.GetValuesArrayはnot an を返しますIEnumerable<T>。つまり、キャストする必要があります

Enum.GetValues(typeof(EnumType)).Cast<EnumType>();
于 2013-11-11T15:15:14.513 に答える
4
    private IEnumerable<T> GetEnumValues()
    {
        Type enumType = EnumType;

        return Enum.GetValues(enumType).ToList<T>();
    } 
于 2013-11-11T15:15:39.073 に答える
3

この行がエラーをスローしていると思いますか?:

return Enum.GetValues(enumType);

エラー メッセージによると、キャストがありません。キャストを追加してみましたか?:

return Enum.GetValues(enumType).Cast<T>();

.GetValues()メソッド onはをEnum返しますArray。また、これは列挙できる (実装するIEnumerable) ものですが、一般的な列挙型ではありません (コンパイル時には実装しませんが、ドキュメントでは実行時に使用できるようになると示されています)。IEnumerable<T>

IEnumerableをas として返すには、IEnumerable<T>キャストする必要があります。コレクションは常に直接共変であるとは限らないため.Cast<T>()、コレクションを変換するための便利なメソッドが用意されています。

于 2013-11-11T15:16:27.860 に答える