c# 7.3 中添加了“非托管”泛型类型约束,但我很好奇为什么没有同时(或之后)添加相应的“托管”类型约束?
非托管约束非常接近原始类型的约束,但也会约束不引用任何托管类型的结构。很好,但是我想写一个恰好相反的约束。我的直接用例是为 IDictionary
public static void Add(this IDictionary
和
public static bool TryGetValue(this IDictionary
显然,实现将使用键从字典中添加和获取值:typeof(TValue)。
当您在字典中拥有唯一的不同类型的对象时,拥有这些方法(对我而言)是有意义的,通常是用户定义的类或结构,其中结构需要包含一些托管类型引用。但是这样的方法对于通过独特的原始类型存储值没有多大意义,所以我想排除这些值被映射到方法。
我知道还有其他解决方案(例如使用 KeyedByTypeCollection)来解决用例。请不要通过指向用例的另一个解决方案来回答问题。我只是举个例子。我相信必须有许多其他用例具有托管约束(可能与非托管案例一样多),坦率地说,我有点惊讶之前似乎没有人问过这个问题(至少我可以找不到任何关于它的东西)。
我认为你正在寻找的东西没有价值。如果您只需要引用类型,则可以使用
where TValue : class
约束。引用类型总是被管理的。
但是,如果您使用值类型约束(例如使用
where TValue : struct
),这包括所有 unmanaged
类型,因为有些操作允许在非托管类型上使用(例如 blitting),但不允许在一般结构(具有引用的结构)上使用).但是 struct
类型上允许的所有操作也允许在 blittable 类型上进行。因此,没有理由只对 managed
类型设置通用约束。