我还在为一个项目学习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();
        }
    }

但是,当我试图使用以下代码将这个SampleDataSource类的实例转换为IEnumerable<object>时:
Items = (IEnumerable<MyObject>)App.SampleData;

我收到一个例外:
附加信息:无法转换类型为的对象
'expression.blend.sampledata.sampledatasource.sampledatasource'到
类型
'system.collections.generic.ienumerable`1[表达式.blend.sampledata.sampledatasource.myobject]'。
但我不太明白为什么-我的SampleDataSource不能正确地充当返回包含IEnumerable类型的枚举器的MyObject

最佳答案

它不能只实现方法,而是必须实际实现接口。
在您的情况下,最好让您的类实现适当的接口。

public class SampleDataSource : IEnumerable<MyObject>, IEnumerable

否则,您可以使用类似linfu的东西将您的类隐式输入到接口。
另一个潜在的目标是使用OfType<T>来处理这个问题:
// returns enumerable of the items that are actually assignable to MyObject
IEnumerable<MyObject> values = theDataSource.OfType<MyObject>();

10-06 06:27