IEnumerable.Cast()VS在IEnumerable.Select铸造()

问题描述 投票:10回答:1

假设我有一个IEnumerable<int>,我想这些被转换成它们的ASCII等效字符。

对于一个整数,这纯粹是(char)i,所以总有collection.Select(i => (char)i),但我认为这将是一点点清洁剂使用collection.Cast()

任何人都可以解释为什么我得到一个InvalidCastException当我使用collection.Cast<char>()但不与collection.Select(i => (char)i)

编辑:有趣的是,当我打电话collection.OfType<char>()我得到一个空集。

c# linq casting enumerable
1个回答
11
投票

Cast<T>OfType<T>方法仅执行参考和取消装箱转换。因此,他们可以在一个值类型不能转换为其他类型的值。

该方法的非通用IEnumerable界面上操作,所以他们基本上是从IEnumerable<object>转换为IEnumerable<T>。所以,你不能使用Cast<T>IEnumerable<int>转换为IEnumerable<char>的原因是,你不能施放盒装intchar同样的原因。

从本质上讲,这是因为以下失败Cast<char>在你的榜样失败:

object ascii = 65;
char ch = (char)ascii;   <- InvalidCastException

见乔恩斯基特的优秀EduLinq post了解更多详情。

© www.soinside.com 2019 - 2024. All rights reserved.