在Nullable micro-optimizations, part one中,Eric提到Nullable<T>
有一个奇怪的拳击行为,这是由类似的用户定义类型无法实现的。
C#语言授予预定义Nullable<T>
类型的特殊功能有哪些?特别是那些无法在MyNullable
类型上工作的那些。
当然,Nullable<T>
有特殊的语法糖T?
,但我的问题更多是关于语义。
答案 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类型上定义的用户定义的隐式转换。以下是我不确定的事项:
答案 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;
}