繁体   English   中英

Nullable怎么样? <T> 与类似的自定义C#结构不同?

[英]How is Nullable<T> different from a similar custom C# struct?

Nullable微优化(第一部分)中 ,Eric提到Nullable<T>具有奇怪的装箱行为 ,而这种行为无法通过类似的用户定义类型实现。

C#语言赋予预定义的Nullable<T>类型有哪些特殊功能? 特别是那些无法在MyNullable类型上工作的MyNullable

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

我得到的是: 没有盒装可空的东西 当你装入一个int ,你得到一个盒装int的引用。 当你装一个int? ,您获得空引用或对盒装int的引用。 你永远不会得到盒装int?

您可以轻松地创建自己的Optional<T>结构,但不能实现具有该装箱行为的结构。 Nullable<T>的特殊行为被烘焙到运行时。

这一事实导致了许多奇怪的事情。 例如:

而且仅供参考, Nullable<T>类型还有其他方式是“神奇的”。 例如,尽管它是结构类型,但它不满足结构约束。 您无法创建具有该属性的自己的结构。

我在C#规范中找到了这两个:

  • is运营商在T? 就像在Tas运算符可以转换为可空类型。
  • 对非可空值类型进行操作的预定义和用户定义的运算符被提升为这些类型的可空形式。

现在,我认为这些功能不仅限于Nullable<T>

  • switch的值可以是可空类型。 我认为这不重要,因为switch也接受可以在MyNullable类型上定义的用户定义的隐式转换。
  • 支持Nullable IDisposable类型,在生成对Dispose()的调用之前插入空检查。 我不认为这很重要,因为我可以将MyNullable定义为一个类,然后它将是相同的。

这是我不确定的:

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

C#提升运营商的可空类型。 例如:

int? SumNullableInts(int? a, int? b)
{
    return a + b;
}

你必须在MyNullable<T>做很多反射工作来支持它,然后下面的代码将编译,它不应该:

MyNullable<List<string>.Enumerator> SumNullableEnumerators(MyNullable<List<string>.Enumerator> a, MyNullable<List<string>.Enumerator> b)
{
    return a + b;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM