c# - Enumerable.Cast<T> 扩展方法无法从 int 转换为 long,为什么?

标签 c# linq casting

<分区>

Possible Duplicate:
Puzzling Enumerable.Cast InvalidCastException

你好,

我刚刚注意到 Enumerable.Cast<T> 有点奇怪扩展方法...似乎无法从 int 转换至 long ,即使这个转换是完全合法的。

以下代码失败并返回 InvalidCastException :

        foreach (var item in Enumerable.Range(0,10).Cast<long>())
        {
            Console.WriteLine(item);
        }

但是这段代码,我认为是等价的,确实有效:

        foreach (var item in Enumerable.Range(0,10).Select(i => (long)i))
        {
            Console.WriteLine(item);
        }

任何人都可以解释这种行为吗?我用 Reflector 查看了 Cast 方法的代码,但是 Reflector 不能解释迭代器 block ,所以很难理解......

最佳答案

Cast 中的相关行:

 this.<>2__current = (TResult)this.<obj>5__ab;

我们可以使用下面的代码来模拟这一点:

int foo = 1;
long bar = Cast<long>(foo); //oh noes!

T Cast<T>(object input)
{
    return (T)input;
}

这也失败了。这里的关键是,在转换点,它是一个对象。不是整数。这失败了,因为我们只能从一个对象拆箱到我们想要的确切类型。我们从对象开始——它可能是一个长盒装的,但它不是。这是一个盒装整数。 Eric Lippert discussed this on his blog :

we’ve decided that unboxing can only unbox to the exact type. If you want to call the slow method that does all that goo, it’s available – you can always call Convert...

在您的有效代码中,您处理的不是装箱的 int(一个对象),而是一个 int。

关于c# - Enumerable.Cast<T> 扩展方法无法从 int 转换为 long,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1684448/

相关文章:

c# - 从 C# 可执行文件中扫描 DLL 依赖项

c# - Linq - 获取 2 个匹配元素之间的所有项目

mysql - 如何从 VB/C# EF 代码中删除从属表中的记录?

c# - Dapper 嵌套对象查询 - 不填充所有属性

c# - 确定 (x,y,z) 点是否在由点数组定义的形状内

c# - 如何处理 'The controller for path '/index' 未找到或未在 asp.net mvc 中实现 IController'?

c++ - 在 Qt 开发人员中将 double 转换为 int

c++ - 从原始内存中读取值(符合 MISRA)

c# - 如何在 foreach 循环中创建具有多个 xelement 节点的顶级 xelement

java - Groovy Java 交叉编译 instanceof