【发布时间】:2014-07-07 13:59:54
【问题描述】:
如果这是一个愚蠢的问题,请原谅,我正在努力更好地理解 .Net 中的 Nullable 类型。
根据我从 Microsoft 源代码(使用 ReSharper)中注意到的内容,我知道 Nullable 是一个结构,而 T 必须是一个结构
public struct Nullable<T> where T : struct
现在,我尝试做这样的事情
public struct CustomNullable<T> where T : struct
{
}
public class CustomNullableClass<T> where T : struct
{
}
我在编译时遇到错误:
Nullable<int?> a = null;
Nullable<Nullable<int>> a1 = null;
对于上述代码,我收到一个错误“只有不可为 null 的值类型可能是 System.Nullable 的基础”,但这在 Nullable 类型中是如何强制执行的?
对于
CustomNullable<int?> a2 = null;
CustomNullableClass<int?> a3 = null;
我收到一个错误“System.Nullable 类型必须是不可为空的值类型才能将其用作参数 T”。
我现在有点困惑,谁能帮我理解发生了什么或者我没有理解什么?
非常感谢。
编辑: 如果结构是值类型并且值类型不能为空,那么 Nullable 怎么可能是结构呢?
学分:花钱的人
【问题讨论】:
-
我确定有重复但我找不到。编辑:完成!
-
你为什么想要一个可以为空的可空类型?
-
如果结构是值类型并且值类型不能为空,那么
Nullable怎么可能是结构? -
@spender 实际上,
Nullable并不能真正成为null,它“只是”具有与null相比产生true的特殊状态。这很明显,因为在nullNullable上您仍然可以检索属性HasValue。有趣的是,一旦您box 可空的null值,它就变成实际null并调用任何方法导致NullReferenceException- 类型中的另一个hack系统(参考来源中的评论:we have special type system support that says a a boxed Nullable<T> can be used where a boxed<T> is used)。
标签: c# .net compiler-construction nullable internals