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类型的枚举器?
它不仅可以实现方法,而且必须实际实现接口.
在你的情况下,最好让你的类实现适当的接口.
public class SampleDataSource : IEnumerable<MyObject>, IEnumerable
Run Code Online (Sandbox Code Playgroud)
另一个潜在的对象是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)