LINQ查询抛出InvalidCastException?

时间:2014-05-07 09:27:21

标签: c# linq casting

我在不同的网站中漫游以进行投射技术,我构建了以下代码以从float投射到int,如下所示

var floatList = new float[] { 2.7f, 3.1f, 4.5f };
var intList = from int test1 in floatList 
              select test1;

foreach (var v in intList) 
    Console.Write("{0} ", v.ToString());

但是上面的代码会引发InvalidCastException。为什么是这样?我认为它应该打印3,34

2 个答案:

答案 0 :(得分:15)

形式的LINQ子句:

from X x in y

相当于

y.Cast<X>()

然后使用x作为范围变量。您的查询的其余部分是简并的,因此您的代码等同于:

var intList = floatList.Cast<int>();

现在Enumerable.Cast() 执行此类转换 - 只是确实引用了转化和装箱/拆箱转化。对于任何其他转化,您需要Select

var intList = floatList.Select(x => (int) x);

或者如果你真的要使用查询表达式:

var intList = from x in floatList select (int) x;

...但是对于像这样的简单查询,我不会使用查询表达式 - 我只是使用上面显示的方法调用。

答案 1 :(得分:5)

这是因为intfloats中没有int i你指定查找int s,导致内部广播没有int i = 2.7f;工作(如var ints = from f in floats select (int)f; )。

我认为这将是它的工作方式:

{{1}}