Nullable <t>与类似的自定义C#结构有什么不同?</t>

时间:2012-12-20 20:53:26

标签: c# nullable language-features boxing

Nullable micro-optimizations, part one中,Eric提到Nullable<T>有一个奇怪的拳击行为,这是由类似的用户定义类型无法实现的。

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

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

3 个答案:

答案 0 :(得分:11)

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

您可以轻松制作自己的Optional<T>结构,但无法实现具有该装箱行为的结构。 Nullable<T>的特殊行为已经融入运行时。

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

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

答案 1 :(得分:2)

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

  • is运算符与T?上的T一样,as运算符可以转换为可空类型。
  • 对非可空值类型进行操作的预定义和用户定义的运算符被提升为这些类型的可空形式。

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

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

以下是我不确定的事项:

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

答案 2 :(得分:2)

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;
}