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。