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