C#;无效的例外情况,什么´;怎么了?

C#;无效的例外情况,什么´;怎么了?,c#,linq,exception,C#,Linq,Exception,我想将列表的对象强制转换为它的子类。 为此我用了 现在,当我执行代码时,我总是在System.Core.dll“”中得到一个InvalidCastException“”对象项不能转换为子项“ [可序列化] 公共类子项:项 { 公共子项(int-id):基(id) { } } 公共getStuff(int-id){ //抛出错误的位置 //库存中有物品,而且atm库存肯定不是空的,但以后可能是空的 var items=Inventory.FindAll(x=>x.id==id.

我想将列表的对象强制转换为它的子类。 为此我用了

现在,当我执行代码时,我总是在System.Core.dll“”中得到一个InvalidCastException“”对象项不能转换为子项“

[可序列化]
公共类子项:项
{
公共子项(int-id):基(id)
{          
}
}
公共getStuff(int-id){
//抛出错误的位置
//库存中有物品,而且atm库存肯定不是空的,但以后可能是空的
var items=Inventory.FindAll(x=>x.id==id.Cast().ToList();
}
项目是从一个API,我不能改变那里的任何东西。 项继承自IEquatable


LINQ确实在工作,但当我施放时,我得到了错误。我做错了什么?

我将假设您的属性
库存
是泛型
项的强类型集合/列表/IEnumerable
(示例:
ICollection

如果一个或多个项目不是泛型参数中指定的类型,则调用
Cast
时将出现
InvalidCastException
。请参阅Microsoft页面中的详细信息。若要解决此问题,您只需检索该类型的项目,该项目将在筛选过程中对其执行强制转换。这可以通过以下方法完成。您的代码en变成:

var items = Inventory.FindAll(x=> x.id==id).OfType<SubItem>().ToList();
var items=Inventory.FindAll(x=>x.id==id).OfType().ToList();

从文件中

如果无法将某个元素强制转换为类型TResult,则此方法将引发异常。若要仅获取可强制转换为类型TResult的元素,请使用OfType方法而不是强制转换(IEnumerable)


根据这些评论进行编辑

确定返回的所有项目都属于
项目
类型,而不是
子项目
。这解释了异常情况

…说这个列表由一个项目组成,这就是为什么我想把它们降到子项目

您在问题中发布的继承层次结构是
System.Object
->
->
子项
(我包括Object,因为我假设我们正在处理引用类型,以及所有最终从System.Object继承的内容)。这意味着可以将
子项
转换为
系统。对象
实例可以转换为
系统。对象
。但是,相反的情况不是真的,您不能转换图形。
系统。对象
的实例不能成为
项目
不能成为子项目

拥有一个通用的
列表
是可以的,它可以包含类型
子项
或从
派生的任何内容。但同样,您不能将
的实例强制转换为
子项


如果这还不清楚,那么我建议您阅读一下继承和多态性,这是一个不同的主题,但如果您想知道为什么要使用继承以及是什么使它成为一个非常好的抽象工具,这也是非常重要的。

我将假设您的属性
清单
是强类型集合/通用类型的列表/IEnumerable
(示例:
ICollection

如果一个或多个项目不是泛型参数中指定的类型,则调用
Cast
时将出现
InvalidCastException
。请参阅Microsoft页面中的详细信息。若要解决此问题,您只需检索该类型的项目,该项目将在筛选过程中对其执行强制转换。这可以通过以下方法完成。您的代码en变成:

var items = Inventory.FindAll(x=> x.id==id).OfType<SubItem>().ToList();
var items=Inventory.FindAll(x=>x.id==id).OfType().ToList();

从文件中

如果无法将某个元素强制转换为类型TResult,则此方法将引发异常。若要仅获取可强制转换为类型TResult的元素,请使用OfType方法而不是强制转换(IEnumerable)


根据这些评论进行编辑

确定返回的所有项目都属于
项目
类型,而不是
子项目
。这解释了异常情况

…说这个列表由一个项目组成,这就是为什么我想把它们降到子项目

您在问题中发布的继承层次结构是
System.Object
->
->
子项
(我包括Object,因为我假设我们正在处理引用类型,以及所有最终从System.Object继承的内容)。这意味着可以将
子项
转换为
系统。对象
实例可以转换为
系统。对象
。但是,相反的情况不是真的,您不能转换图形。
系统。对象
的实例不能成为
项目
不能成为子项目

拥有一个通用的
列表
是可以的,它可以包含类型
子项
或从
派生的任何内容。但同样,您不能将
的实例强制转换为
子项


如果这还不清楚,那么我建议您阅读一些关于继承和多态性的书籍,这是一个不同的主题,但如果您想知道为什么要使用继承以及是什么使它成为一个非常好的抽象工具,这也是非常重要的。

可能是列表中的某些项不是派生类类型,您应该d能够在调试器中看到这一点。另外,正如有人指出的,在执行强制转换之前,您可能必须从数据库中提取数据,linq提供程序可能无法为您执行此操作

因此,您可以尝试以下任一方法:

  • 筛选出不属于子项的项
var items=Inventory.FindAll(x=>x.id==id).OfType().ToList();
    var items = Inventory.Where(x => x.id == id).Select(x => new SubItem(x.id)).ToList();