为啥 Nullable<T> 不匹配作为通用约束的引用类型 [重复]

Posted

技术标签:

【中文标题】为啥 Nullable<T> 不匹配作为通用约束的引用类型 [重复]【英文标题】:Why does Nullable<T> not match as a reference type for generic constraints [duplicate]为什么 Nullable<T> 不匹配作为通用约束的引用类型 [重复] 【发布时间】:2012-12-10 03:20:58 【问题描述】:

可能重复:Nullable type as a generic parameter possible?

我遇到了一个非常奇怪的泛型类型约束。我有这样的课:

public SomeClass<T> where T:class


但是,我发现我不能像预期的那样使用可为空的类型:

new SomeClass<int?>();

我收到一个错误,int? 必须是引用类型。 Nullable 真的只是一个带有语法糖让它看起来像引用类型的结构吗?

【问题讨论】:

限制的原因是什么?你能提供更多的上下文吗?仅供参考 Nullable 声明为:public struct Nullable&lt;T&gt; where T : struct @SimonWhitehead 基本上是因为在此类上使用值类型可能会产生意想不到的行为和巨大的性能影响 那么我想直接的答案是“是的,Nullable 是一个结构”。我不太确定你认为什么是 Nullable 的语法糖。看来您唯一的选择就是自己动手。 @SimonWhitehead 你可以做到int? x = null,但你不能用任何其他值类型做到这一点。所以我需要限制where T:class, T:Nullable,但这似乎并不上班 null 和任何 Nullable 值之间存在简单的隐式转换。它实际上并不存储 null,它只是有一个布尔值 HasValue 并将 null 分配给它会导致它是 false 并且实际的 Value 属性是......任何东西。这意味着将值放入可为空的结构实际上并不会将其装箱或导致它获得引用语义。这确实需要特殊的编译器支持,因为无法为 null 的结构提供隐式转换的自定义类型,同时也不允许使用它转换任何实际对象。 【参考方案1】:

Nullable&lt;T&gt; 是一个struct(参见MSDN),但它是唯一一个不满足struct 约束的struct。因此,当使用classstruct 约束时,您不能将Nullable 用作泛型类型参数。

Nullable&lt;T&gt; 不仅仅是一个带有一些语法糖的结构。它在 CLR 中为其某些行为提供了特殊支持。例如,它具有特殊的拳击行为。具体来说,一个可为空的对象永远不会被装箱。基础价值被装箱。如果 nullable 是 null 值(HasValue 为 false),则将其转换为 null 引用。此外,任何Nullable&lt;T&gt;Nullable&lt;U&gt; 的转换运算符都从TU 的转换中提升。这些是您无法在 .NET 1.0/1.1 中自己实现的功能。

【讨论】:

以上是关于为啥 Nullable<T> 不匹配作为通用约束的引用类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

术语:您如何描述 Nullable<T> 的类型 T?

为啥 GetType 返回 System.Int32 而不是 Nullable<Int32>? [复制]

这种 Nullable<T> 行为与隐式转换运算符的理由是啥

Nullable<T> 的内存占用是多少

非 Nullable 类型的通用约束

<button> 在 chrome 中工作,但在 Firefox 中不工作 - 为啥?