C# 尝试强制转换IEnumerable时发生异常?

C# 尝试强制转换IEnumerable时发生异常?,c#,generics,casting,ienumerable,C#,Generics,Casting,Ienumerable,我还在为一个项目学习C#的前几周,我正在努力正确地实现IEnumerable接口。我已经阅读了很多教程/指南,但我似乎仍然做了一些不正确的事情。我有很强的Java背景,因此我认为我对Java泛型的一些知识混淆了我对它们在C#中如何工作的理解 我无法更改的类包含一个实例变量: 公共IEnumerable项 我想为它提供我的SampleDataSource类的一个实例。此类充当MyObject类型的列表的存储容器: public class SampleDataSource : IEnume

我还在为一个项目学习C#的前几周,我正在努力正确地实现
IEnumerable
接口。我已经阅读了很多教程/指南,但我似乎仍然做了一些不正确的事情。我有很强的Java背景,因此我认为我对Java泛型的一些知识混淆了我对它们在C#中如何工作的理解

我无法更改的类包含一个实例变量:

公共IEnumerable项

我想为它提供我的
SampleDataSource
类的一个实例。此类充当
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();
        }
    }
我收到一个例外:

其他信息:无法强制转换类型为的对象 “Expression.Blend.SampleData.SampleDataSource.SampleDataSource”到 类型 'System.Collections.Generic.IEnumerable'1[Expression.Blend.SampleData.SampleDataSource.MyObject]'


但是我不太明白为什么我的
SampleDataSource
不能正确地充当一个
IEnumerable
返回一个包含
MyObject
类型的枚举数吗?

它不能仅仅实现方法,而是必须实际实现接口

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

public class SampleDataSource : IEnumerable<MyObject>, IEnumerable
公共类SampleDataSource:IEnumerable,IEnumerable
否则,您可以使用类似于duck的方法将类类型转移到接口

另一个潜在对象是使用类型
来处理此问题:

// returns enumerable of the items that are actually assignable to MyObject
IEnumerable<MyObject> values = theDataSource.OfType<MyObject>();
//返回实际可分配给MyObject的项的可枚举项
IEnumerable values=类型()的数据源;

我意识到问题已经得到了回答,但我错过了对问题背后的简单解释,因此:

无法将
SampleDataSource
类分配给
IEnumerable
字段的原因是
SampleDataSource
未实现
IEnumerable
。虽然它确实实现了
IEnumerable
,但这还不够好,因为
IEnumerable
IEnumerable
的一个子类型

由于接口协方差,如果类实现了
IEnumerable
,则可以将该类分配给
IEnumerable
字段,前提是MyObject实际上是引用类型(即类)。但是,这只适用于C#4.0及更高版本

Reed Copsey的回答没有提到可以这样声明SampleDataSource类,因为
IEnumerable
继承自
IEnumerable

public class SampleDataSource : IEnumerable<MyObject>
也许你应该这样做:

classICannotAlter.Items = (IEnumerable<object>)someSampleDataSourceInstance;
classICannotAlter.Items = (IEnumerable<object>)someSampleDataSourceInstance.Subjects;
classICannotAlter.Items=(IEnumerable)someSampleDataSourceInstance.Subjects;

你能说得更具体些吗?它是否正确地实现了这里的接口:
SampleDataSource:IEnumerable
?@craig它需要实现
IEnumerable
@craig您是在尝试获取
IEnumerable
还是
IEnumerable
?啊,这确实是个问题,必须在我实现的接口中添加一个类型声明。(除了实现没有定义类型的
IEnumerable
接口之外。)我正在尝试将此类的实例分配给一个变量,该变量需要一个
IEnumerable
我仍在实现您的解决方案,但我将在一秒钟内返回以接受:)
classICannotAlter.Items = (IEnumerable<object>)someSampleDataSourceInstance;
classICannotAlter.Items = (IEnumerable<object>)someSampleDataSourceInstance.Subjects;