施奈的Linq异常

时间:2016-05-16 07:56:59

标签: c# linq casting

我有一小段代码要重构。有人用这种风格写了演员:

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

抛出异常

任何人都知道为什么?

3 个答案:

答案 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!
}