【发布时间】:2012-12-10 03:20:58
【问题描述】:
我遇到了一个非常奇怪的泛型类型约束。我有这样的课:
public SomeClass<T> where T:class
{
}
但是,我发现我不能像预期的那样使用可为空的类型:
new SomeClass<int?>();
我收到一个错误,int? 必须是引用类型。 Nullable 真的只是一个带有语法糖让它看起来像引用类型的结构吗?
【问题讨论】:
-
限制的原因是什么?你能提供更多的上下文吗?仅供参考 Nullable 声明为:
public struct Nullable<T> where T : struct -
@SimonWhitehead 基本上是因为在此类上使用值类型可能会产生意想不到的行为和巨大的性能影响
-
那么我想直接的答案是“是的,Nullable 是一个结构”。我不太确定你认为什么是 Nullable 的语法糖。看来您唯一的选择就是自己动手。
-
@SimonWhitehead 你可以做到
int? x = null,但你不能用任何其他值类型做到这一点。所以我需要限制where T:class, T:Nullable,但这似乎并不上班 -
null和任何Nullable值之间存在简单的隐式转换。它实际上并不存储 null,它只是有一个布尔值HasValue并将 null 分配给它会导致它是 false 并且实际的Value属性是......任何东西。这意味着将值放入可为空的结构实际上并不会将其装箱或导致它获得引用语义。这确实需要特殊的编译器支持,因为无法为null的结构提供隐式转换的自定义类型,同时也不允许使用它转换任何实际对象。
标签: c# generics nullable reference-type generic-constraints