我在不同的网站中漫游以进行投射技术,我构建了以下代码以从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,3
和4
。
答案 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)
这是因为int
和floats
中没有int i
你指定查找int
s,导致内部广播没有int i = 2.7f;
工作(如var ints = from f in floats
select (int)f;
)。
我认为这将是它的工作方式:
{{1}}