【问题标题】:Nullable<int?> is not possible, Why not? [duplicate]Nullable<int?> 是不可能的,为什么不呢? [复制]
【发布时间】: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 的特殊状态。这很明显,因为在null Nullable 上您仍然可以检索属性HasValue。有趣的是,一旦您box 可空的null 值,它就变成实际 null 并调用任何方法导致NullReferenceException - 类型中的另一个hack系统(参考来源中的评论:we have special type system support that says a a boxed Nullable&lt;T&gt; can be used where a boxed&lt;T&gt; is used)。

标签: c# .net compiler-construction nullable internals


【解决方案1】:

实际上,这是 C# 编译器中某处的内部 hack(猜测)。您不能在自己的课程中复制它。如果您使用完全相同的 IL 创建自己的类型,它将不会强制执行附加的隐藏约束。

【讨论】:

    【解决方案2】:

    有专门针对Nullable 的特殊编译器支持。您无法使用自定义结构重现 Nullable 的许多不同可能行为。其中一种行为是您在此处提到的,Nullable 不符合 struct 的一般约束,尽管它是 struct。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多