繁体   English   中英

LINQ 的铸造方法表现出意外

[英]Cast method of LINQ behaves unexpected

我想将字符串转换为字节数组。 当我使用 LINQ 的 Cast 功能尝试此操作时,我得到一个“System.InvalidCastException”。 为什么? 这是我尝试过的:

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

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

在 .NET 3.5 SP1 之前,它实际上确实为您执行了更多的转换。 我确信执行代码审查的人在博客上写过它,但我永远记不起它是谁。 (我一直认为是 Eric Lippert,但不是。)我会查一下。

我要说的一件事是,这可以得到更好的记录。

碰巧,这是比尔瓦格纳 最近视频中的第一个谜题。

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

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

尝试这个:

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

来自安德斯·海尔斯伯格

是的,由于 .NET 3.5 的 RTM 版本中的错误(我应该说意外功能吗?) Cast 方法适用于某些转换,但具有意外的语义。 例如,浮点到整数的转换使用银行四舍五入,而常规 C# 将四舍五入向零。 此外,在 .NET 3.5 RTM 中,Cast 方法相当缓慢且效率低下。 所有这些都在 SP1 中得到了修复,Cast 现在只支持最初预期的引用和装箱转换——而且效率很高。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM