You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8中bool是否为blittable类型?为何测试代码未抛异常?

为什么GCHandle.Alloc(new bool(), GCHandleType.Pinned)不抛出异常?

核心原因

.NET 5+(包括你使用的.NET 8)的跨平台运行时对单个值类型的固定逻辑做了调整:即使类型被标记为非blittable(比如bool),固定单个值类型实例时不会抛出ArgumentException。

这是因为:

  • 值类型本身是值语义,单个实例的内存布局连续且可直接访问,固定操作不需要处理复杂的引用或非连续内存结构。
  • 文档中提到的“通过固定GCHandle判断blittable”的规则,更多适配.NET Framework的行为,或者针对包含非blittable成员的复杂引用类型/值类型,而非单个基础值类型。

验证bool非blittable的正确方式

要准确验证bool的blittable属性,应使用Marshal.IsBlittable方法,在你的环境中运行会返回false,完全符合文档描述:

using System.Runtime.InteropServices;
Console.WriteLine(Marshal.IsBlittable(typeof(bool))); // 输出: False

补充说明

文档中GCHandle.Alloc抛出ArgumentException的场景,主要适用于:

  • 非字符串的引用类型,且类型本身或其成员包含非blittable内容。
  • 包含非blittable成员的复杂值类型(比如自定义结构体中包含string或其他非blittable类型字段)。

而单个基础值类型(即使是非blittable),在.NET Core及后续版本中允许被固定,因为这类操作不会引发内存安全问题。

内容的提问来源于stack exchange,提问作者sweemer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:51:04