尝试转换IEnumerable时出现异常?

Cra*_*tis 4 c# generics ienumerable casting

在我学习C#项目的前几周,我还在努力正确地实现这个IEnumerable界面.我已经阅读了许多教程/指南,但我似乎仍然做错了什么.我有一个强大的Java背景,所以我认为我对Java泛型的一些知识让我理解它们如何在C#中工作.

那类,我不能改变包含一个实例变量:

public IEnumerable<object> Items;

我想提供一个SampleDataSource班级实例.此类充当用于存储容器List的MyObject类型:

    public class SampleDataSource : IEnumerable
    {
        public List<MyObject> Subjects { get; private set; }

        public IEnumerator<MyObject> GetEnumerator()
        {
            return this.Cast<MyObject>().GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,当我试图施放一个实例如此SampleDataSource类的来IEnumerable<object>使用此代码:

Items = (IEnumerable<MyObject>)App.SampleData;
Run Code Online (Sandbox Code Playgroud)

我收到一个例外:

其他信息:无法转换类型"Expression.Blend.SampleData.SampleDataSource.SampleDataSource"的目的为类型"System.Collections.Generic.IEnumerable`1 [Expression.Blend.SampleData.SampleDataSource.MyObject]".

但我不太明白为什么 - 是不是我SampleDataSource正确地表现为IEnumerable返回包含MyObject类型的枚举器?

Ree*_*sey 6

它不仅可以实现方法,而且必须实际实现接口.

在你的情况下,最好让你的类实现适当的接口.

public class SampleDataSource : IEnumerable<MyObject>, IEnumerable
Run Code Online (Sandbox Code Playgroud)

否则,你可以使用像linfu这样的东西将你的类打包到接口.

另一个潜在的对象是OfType<T>用来处理这个:

// returns enumerable of the items that are actually assignable to MyObject
IEnumerable<MyObject> values = theDataSource.OfType<MyObject>();
Run Code Online (Sandbox Code Playgroud)