C# 将接口列表强制转换为对象列表

C# 将接口列表强制转换为对象列表,c#,C#,我有一个返回List的方法。我希望我能够将该方法的结果强制转换为列表,只要该类实现了该接口。但是,我在尝试执行此操作时收到以下错误: 无法将类型为System.Collections.Generic.List'1[i集成接口]的对象强制转换为类型System.Collections.Generic.List'1[ThisClass] 有什么想法吗?我需要为此编写构造函数吗?恐怕您的期望不正确。列表允许包含实现接口的任何类型的元素。如果允许您将其强制转换为列表,则强制转换将添加一个限制-突然,列表

我有一个返回
List
的方法。我希望我能够将该方法的结果强制转换为
列表
,只要该类实现了该接口。但是,我在尝试执行此操作时收到以下错误:

无法将类型为
System.Collections.Generic.List'1[i集成接口]
的对象强制转换为类型
System.Collections.Generic.List'1[ThisClass]


有什么想法吗?我需要为此编写构造函数吗?

恐怕您的期望不正确。
列表
允许包含实现接口的任何类型的元素。如果允许您将其强制转换为
列表
,则强制转换将添加一个限制-突然,列表中只允许接口的特定实现,例如,当您从列表中获取一个项目时,您可以假定它属于
ThisClass
——可能是,也可能不是,因为您得到的列表限制较少。

如果您有
列表
,则无法将该列表对象强制转换为
列表
。即使列表中的所有项目都是
ThisClass
对象,列表仍然是
i接口
对象的列表

您需要做的是创建一个新的
列表
列表,然后使用原始列表中的所有项目填充该列表,但首先将这些项目转换为
ThisClass

幸运的是,这正是LINQ方法所做的:

List List=GetData();
//将列表强制转换为“ThisClass”列表
List newList=List.Cast().ToList();
否(举例说明)

更新:

对于一些人来说,必须说明Giraffe和Lion都实现了一个名为IAnimal的接口,并且Giraffe不是Lion的子类。其他人设法理解,我的界面类似于IAnimal,这个类类似于狮子,带有修辞性的“应该这样做”

答案显然是否定的。狮子是IAnimal的具体化,但这并不意味着拥有IAnimal的实例就意味着拥有狮子。这样的演员阵容将抛出,但也显然是错误的,因此巧妙地说明了问题。同样地,实现IThisInterface的此类意味着此类是IThisInterface的具体化,但仅仅因为您发现自己拥有一个IThisInterface的集合,并不意味着您可以假设这是此类的列表。它可能是,但同样地,它也可能是实现i接口的任何其他对象


无论如何,如果你搜索协方差和逆变,你会发现一些类似的问题,让你进一步理解。

你在哪里施放代码?为什么施放?您应该能够访问界面上的方法这完全有道理。谢谢这很有道理。谢谢。我刚刚测试了这个解决方案,效果很好。非常感谢您,@poke@christok值得一提的是,如果任何项不是
ThisClass
,那么这将引发异常,您可以使用
list.OfType().ToList()
。当然,这也回避了一个问题,为什么你要在第一时间投下它们?你有接口是有原因的……这个答案缺少一些有指导意义的东西,比如
IAnimal
Giraffe
Lion
的定义。另外,它在
Lion
赋值中缺少一个变量名。它没有提到抛出了哪个异常(或者即使抛出了一个异常),也没有说明为什么这不起作用。
List<IThisInterface> list = GetData();

// cast the list to a `ThisClass` list
List<ThisClass> newList = list.Cast<ThisClass>().ToList();
IAnimal animal = new Giraffe(); // Giraffe is an IAnimal so OK.
Lion lion = (Lion)animal; // should this work? Lion is an IAnimal???