C#泛型中unmanaged和struct约束的区别

5

where T : struct - 这里 T 必须是值类型。

where T : Unmanaged - 这里 T 不能是引用类型。

如果结构体和非托管类型都用于值类型,它们之间有什么区别?


2
你看过这个文档吗?你不明白哪一部分? - TheGeneral
2
从C# 7.3开始,您可以使用未管理的约束来指定类型参数必须是未管理的类型。未管理的类型是一种不是引用类型并且在任何嵌套级别上都不包含引用类型字段的类型。未管理的约束使您能够编写可重用的例程以处理可以作为内存块操作的类型。 - TheGeneral
3个回答

8
根据https://blog.jetbrains.com/dotnet/2018/07/19/unmanaged-delegate-enum-type-constraints-c-7-3-rider-resharper/,为了满足非托管约束,类型必须是struct,并且该类型的所有字段必须属于以下类别之一:
- 具有sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、IntPtr或UIntPtr类型。 - 枚举类型。 - 指针类型。 - 是满足非托管约束的用户定义结构体。
因此,非托管限制比结构体限制更严格。

1
为了更容易理解: struct 意味着它不接受引用类型,它只接受"值类型"。 Unmanaged 意味着它只接受纯值类型,不能包含任何引用类型部分。
例如:
struct MyStruct
{
    public int f1;
    public string f2;
}

这个结构体在 struct 约束中是合法的,但在 unmanaged 约束中是非法的。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接