LINQ的强制转换方法的行为出乎意料

本文关键字:出乎意料 LINQ 转换方法 | 更新日期: 2023-09-27 18:05:10

我想将字符串转换为字节数组。当我尝试使用LINQ的cast函数时,我得到了一个'System.InvalidCastException'。为什么?下面是我所尝试的:

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

LINQ的强制转换方法的行为出乎意料

Enumerable.Cast 只有执行拆箱和引用转换。执行其他转换,如内置值类型转换和用户定义转换。

在。net 3.5 SP1之前,实际上为你执行了更多的转换。我确信执行代码审查的人在博客上写了它,但我永远记不起是谁。(我一直以为是埃里克·利珀特(Eric Lippert),但不是。)我去查一下。

我想说的是,这可以被更好地记录。

碰巧,这是Bill Wagner最近视频中的第一个谜题。

我想我必须问为什么你要执行一个字符串值转换成字节数组而不使用编码?

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

try this:

var works = x.ToArray()。Select(c => (byte)c).ToArray();

From Anders Hejlsberg:

对,由于RTM中的一个bug(我应该说无意的特性吗?.NET 3.5版本的Cast方法适用于某些转换,但是具有意想不到的语义。例如,从浮点数到整型转换使用银行四舍五入,而常规c#使用四舍五入向零。此外,Cast方法在. net 3.5 rtm。所有这些问题都在SP1中得到了修复,Cast现在只支持引用和装箱转换,如最初预期的那样——并且这样做了高效。

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