LINQ的Cast方法表现出乎意料

时间:2011-08-11 19:08:02

标签: c# linq

我想将字符串转换为字节数组。当我通过使用LINQ的Cast函数来尝试这个时,我得到一个'System.InvalidCastException'。为什么? 这是我尝试过的:

var x = "hallo";
var works = x.Select(c=>(byte)c).ToArray();
var doesNotWork = x.Cast<byte>().ToArray();

4 个答案:

答案 0 :(得分:5)

Enumerable.Cast 执行拆箱和参考转化。它执行其他转换,例如内置值类型转换和用户定义转换。

在.NET 3.5 SP1之前,它实际 为您执行了更多的转换。我确信执行代码审查的人在博客上写了这篇文章,但我永远不会记得它是谁。 (我一直以为是Eric Lippert,但事实并非如此。)我会查一查。

我要说的是,这可以更好地记录下来。

碰巧,这是Bill Wagner's recent video中的第一个益智游戏。

答案 1 :(得分:4)

我想我不得不问你为什么要在不使用编码的情况下将字符串值转换为字节数组?

string value = "Some Value";
byte[] myBytes = System.Text.Encoding.UTF8.GetBytes(value);

答案 2 :(得分:0)

试试这个:

var works = x.ToArray()。选择(c =&gt;(byte)c)。ToArray();

答案 3 :(得分:0)

来自Anders Hejlsberg

  

是的,由于RTM中的错误(我应该说是非预期的功能吗?)   .NET 3.5版本的Cast方法适用于某些转换,但是   意外的语义。例如,浮点到积分   转换使用银行家舍入,而常规C#转换   零。此外,Cast方法相当缓慢且效率低下   .NET 3.5 RTM。所有这一切都在SP1中修复,而Cast现在只支持   引用和装箱转换最初的意图 - 并且这样做   有效。

我认为3.5sp1更改为Enumerable.Cast是为了使其与.Net的转换概念一起使用,这与使用c#的转换语法(特别是转换)所达到的功能不同。这是有道理的.Cast是一个.net框架的东西,而不是一个c#的东西。