如何为空<;T>;与类似的自定义C#struct不同?

如何为空<;T>;与类似的自定义C#struct不同?,c#,nullable,language-features,boxing,C#,Nullable,Language Features,Boxing,在中,Eric提到,Nullable有一种奇怪的装箱行为,这是类似的用户定义类型无法实现的 C语言赋予预定义的Nullable类型哪些特殊功能?尤其是那些无法在MyNullable类型上工作的 当然,Nullable具有特殊的语法糖分T?,但我的问题更多的是关于语义。我在 is操作符在T?上工作,就像在T上一样,并且as操作符可以转换为可为空的类型 对不可为null的值类型进行操作的预定义和用户定义的运算符将提升为这些类型的可为null的形式 现在,以下是我认为不限于可空的的功能: 开关中

在中,Eric提到,
Nullable
有一种奇怪的装箱行为,这是类似的用户定义类型无法实现的

C语言赋予预定义的
Nullable
类型哪些特殊功能?尤其是那些无法在
MyNullable
类型上工作的

当然,
Nullable
具有特殊的语法糖分
T?
,但我的问题更多的是关于语义。

我在

  • is
    操作符在
    T?
    上工作,就像在
    T
    上一样,并且
    as
    操作符可以转换为可为空的类型
  • 对不可为null的值类型进行操作的预定义和用户定义的运算符将提升为这些类型的可为null的形式
现在,以下是我认为不限于
可空的
的功能:

  • 开关中的值可以是可为空的类型。我认为这并不重要,因为switch还接受可以在MyNullable类型上定义的用户定义的隐式转换
  • 支持可为null的IDisposable类型,并在生成的Dispose()调用之前插入null检查。我认为这不重要,因为我可以将MyNullable定义为一个类,然后它就会是一样的
以下是我不确定的:

  • 规范中提到了装箱/取消装箱和隐式/显式转换,但我不明白是否可以使用MyNullable实现相同的结果

    • 我的意思是:没有盒装可空的东西。当你把一个
      int
      框起来时,你会得到一个对被框起来的
      int
      的引用。当您将一个
      int?
      装箱时,您会得到一个空引用或对装箱的
      int
      的引用。您永远不会得到装箱的
      int?

      您可以轻松地创建自己的
      可选的
      结构,但无法实现具有这种装箱行为的结构
      Nullable
      的特殊行为被烘焙到运行时中

      这一事实导致了一些奇怪的现象。例如:

      int? SumNullableInts(int? a, int? b)
      {
          return a + b;
      }
      
      仅供参考,
      Nullable
      类型还有其他“神奇”的方式。例如,尽管它是一个结构类型,但它不满足结构约束。您无法创建具有该属性的自己的结构。

      C#在可空类型上提升运算符。例如:

      int? SumNullableInts(int? a, int? b)
      {
          return a + b;
      }
      
      您必须在
      MyNullable
      中进行大量的反射工作来支持这一点,然后在不应该编译的地方编译以下内容:

      MyNullable<List<string>.Enumerator> SumNullableEnumerators(MyNullable<List<string>.Enumerator> a, MyNullable<List<string>.Enumerator> b)
      {
          return a + b;
      }
      
      MyNullable SumNullable枚举数(MyNullable a,MyNullable b)
      {
      返回a+b;
      }
      
      我在这里找到你的问题纯属偶然。考虑在博客上发表这样的问题。另外,如果您对某个帖子有任何疑问,请随时给我发电子邮件;在博客的“关于”页面上有联系信息。我确实考虑过了,但我还想了解更多关于拳击以外的特殊支持,所以我转向了堆栈溢出。因此,如果我理解正确,优化是这些奇怪行为的原因。谢谢你的解释@难题:不是真的。相反,这些奇怪之处是可空值语义和可空引用语义之间不匹配的结果。这个故事的寓意是:在v1.0而不是v2.0中为类型系统添加可空性。如果可为空的引用类型和可为空的值类型同时被发明,它们会更相似。@EricLippert:你认为事情会有什么不同?我对
      Nullable
      设计的最大反对意见是——至少根据我的理解——在大多数情况下,当代码得到一个
      Nullable
      时,它想要的是一个
      T
      ,并指示它是否有效;
      Nullable
      周围的许多额外内容阻碍了基本任务的完成。您是否有不同的看法?无法指定除
      可空
      之外的值类型不应转换为
      对象
      ,或者这种转换的结果不应是与结构具有相同字段的对象,并初始化为相同的值。