为什么没有“托管”泛型类型约束?

问题描述 投票:0回答:1

c# 7.3 中添加了“非托管”泛型类型约束,但我很好奇为什么没有同时(或之后)添加相应的“托管”类型约束?

非托管约束非常接近原始类型的约束,但也会约束不引用任何托管类型的结构。很好,但是我想写一个恰好相反的约束。我的直接用例是为 IDictionary 编写扩展方法,其中签名如下所示:

public static void Add(this IDictionary map, TValue value) where TValue : managed

public static bool TryGetValue(this IDictionary map, out TValue value) where TValue : managed

显然,实现将使用键从字典中添加和获取值:typeof(TValue)。

当您在字典中拥有唯一的不同类型的对象时,拥有这些方法(对我而言)是有意义的,通常是用户定义的类或结构,其中结构需要包含一些托管类型引用。但是这样的方法对于通过独特的原始类型存储值没有多大意义,所以我想排除这些值被映射到方法。

我知道还有其他解决方案(例如使用 KeyedByTypeCollection)来解决用例。请不要通过指向用例的另一个解决方案来回答问题。我只是举个例子。我相信必须有许多其他用例具有托管约束(可能与非托管案例一样多),坦率地说,我有点惊讶之前似乎没有人问过这个问题(至少我可以找不到任何关于它的东西)。

c# generics types constraints unmanaged
1个回答
1
投票

我认为你正在寻找的东西没有价值。如果您只需要引用类型,则可以使用

where TValue : class
约束。引用类型总是被管理的。

但是,如果您使用值类型约束(例如使用

where TValue : struct
),这包括所有
unmanaged
类型,因为有些操作允许在非托管类型上使用(例如 blitting),但不允许在一般结构(具有引用的结构)上使用).但是
struct
类型上允许的所有操作也允许在 blittable 类型上进行。因此,没有理由只对
managed
类型设置通用约束。

© www.soinside.com 2019 - 2024. All rights reserved.