我有一小段代码要重构。有人用这种风格写了演员:
list.OrderBy(u => (int)u.Original).First();
有时此代码会抛出Invalid Cast Exceptions(字段Original
的类型为object
)。
示例:
list[0].Orginal = 200,
list[1].Orginal = 85
一切都很好。
list[0].Orginal = 275452,
list[1].Orginal = 154754
抛出异常
任何人都知道为什么?
答案 0 :(得分:2)
由于它有时会抛出无效的强制转换异常,这意味着您的列表中有时会有non-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()))
然后事先修复list
。
答案 1 :(得分:1)
正如其他人所说,你应该避免不必要的演员表。在您的班级中,只需将Orginal
的类型从object
更改为int
,您就不需要在LINQ查询中进行强制转换。
答案 2 :(得分:-2)
代码编译并运行没有问题。
https://dotnetfiddle.net/dadrYJ
你的意思是
https://dotnetfiddle.net/ygJTyU
list[0].Orginal = 2147483647;
list[1].Orginal = 154754;
其中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)
{
return (int) u.Orginal;
}
重构:
public int Lambda_OrderBy(Foo u)
{
int64 value = u.Orginal;
return (int) value; // FAIL!
}