为什么char []。Cast <int>引发一个强制转换异常?

时间:2018-01-18 09:09:29

标签: c# linq

这是代码。这很简单。

  var text = "abcdef";
  var c1 = text.Cast<int>().ToArray(); // either this one
  var c2 = text.ToCharArray().Cast<int>().ToArray(); // or this one

在任何一种情况下都会引发无效的强制转换异常。为什么呢?

对于奖励分数,如果不是这样的话,最明智的做法是什么?

所以,代码我实际上会写这个:

  var c3 = text.Select(c=>(int)c).ToArray();

哪种方法正常。

3 个答案:

答案 0 :(得分:5)

查看source code of Cast。当您使用Cast时,您将集合作为object的数组进行迭代,然后将其转换为desidered类型。因此,您发布的代码的生成代码(对于Cast部分)是:

foreach (object item in text)
{
    yield return (int)item;
}

当然,这会产生一个例外hereRawling在评论中提供的链接,谢谢)。

要重现这一点,您可以尝试使用此代码(您将收到相同的错误):

var myChar = 'c';
object myObject = myChar;
int myInt = (int)myObject; // Exception here

可能的解决方案

免责声明:仅根据给定的示例进行测试,当然真的很慢。)

您可以使用Cast制作自己的Convert.ChangeType方法。

public static class IEnumerableExtensions
{
    public static IEnumerable<TResult> MyCast<TResult>(this IEnumerable source)
    {
        var type = typeof(TResult);
        foreach (var item in source)
        {
            yield return (TResult)Convert.ChangeType(item, type);
        }
    }
}

然后您可以像使用Cast一样使用它。

var c1 = text.MyCast<int>();

答案 1 :(得分:1)

我无法找到记录的位置,但LINQ的Cast uses a cast via object,基本上是

int i = (int)(object)c;

字符串中的每个字符。

char,然后尝试将取消装箱作为intisn't possible

答案 2 :(得分:0)

var text = "abcdef";
var intText = text.Select(c => (int)c);

您可以从int的形式将每个字符转换为IEnumerable开始。