C# 强制转换时的Linq异常

C# 强制转换时的Linq异常,c#,linq,casting,C#,Linq,Casting,我有一小段代码要重构。有人以这样的风格写了《演员阵容》: list.OrderBy(u => (int)u.Original).First(); 有时,此代码会引发无效的强制转换异常(字段Original的类型为object) 例如: list[0].Orginal = 200, list[1].Orginal = 85 一切都好 list[0].Orginal = 275452, list[1].Orginal = 154754 抛出异常 有人知道为什么吗?正如其他人建议的那样,你

我有一小段代码要重构。有人以这样的风格写了《演员阵容》:

list.OrderBy(u => (int)u.Original).First();
有时,此代码会引发无效的强制转换异常(字段
Original
的类型为
object

例如:

list[0].Orginal = 200,
list[1].Orginal = 85
一切都好

list[0].Orginal = 275452,
list[1].Orginal = 154754
抛出异常


有人知道为什么吗?

正如其他人建议的那样,你应该避免不必要的演员阵容。在您的类中,只需将
original
的类型从
object
更改为
int
,您就不需要在LINQ查询中进行强制转换。

因为它有时抛出无效强制转换异常,这意味着您的列表中有时有
非int
类型的实例。你可以在铸造之前避免它们,但我想这并不是一个好的设计类型

作为一个快速解决方案,我会按照下面的说明去做

list.Where(u => u.Original is int).OrderBy(u => (int)u.Original).First();
然后我会继续检查我遗漏了什么,如下所示:

list.Where(u => !(u.Original is int)).ForEach(u => Console.WriteLine(u.Original.GetType()))

然后预先修复
列表。

代码编译和运行没有问题

这些不是您要查找的数据类型 你真正的意思是

其中n>0

鉴于此。问题很清楚

重构:

var value = int.MaxValue + n;
list[0].Orginal = value;
int64 value = int.MaxValue + n;
list[0].Orginal = value;
public int Lambda_OrderBy(Foo u)
{
   int64 value = u.Orginal;
   return (int) value; // FAIL!
}
重构:

var value = int.MaxValue + n;
list[0].Orginal = value;
int64 value = int.MaxValue + n;
list[0].Orginal = value;
public int Lambda_OrderBy(Foo u)
{
   int64 value = u.Orginal;
   return (int) value; // FAIL!
}
因此:

public int Lambda_OrderBy(Foo u)
{
   return (int) u.Orginal;
}
重构:

var value = int.MaxValue + n;
list[0].Orginal = value;
int64 value = int.MaxValue + n;
list[0].Orginal = value;
public int Lambda_OrderBy(Foo u)
{
   int64 value = u.Orginal;
   return (int) value; // FAIL!
}

为什么
最初是
对象类型的
?这可能就是你应该重构的地方。为什么你需要使用cast?另外,除了示例中的输入错误外,我看不出这些错误是如何引发异常的。你应该尝试创建一个。你的
u.Original
可能不是
int
。试试FirstOrDefault()因为可能存在序列为空的情况。但为了获得无效的强制转换,某些内容不能是整数。如果该列表只是另一个列表的过滤版本,而该列表实际上包含
对象
-不同类型的实例,该怎么办呢,我也看不出他的代码会在哪里抛出那个异常……我检查了DB模式(这个列表来自DB过程),有人将int改为bigint,但没有修改这个代码。非常感谢你的目标。如果你现在可以使用大的数据库,你应该考虑在代码中使用Loos。