[英]C# Custom generic struct with same compiler behavior as Nullable<T>
[英]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?
就像在T
, as
运算符可以转换为可空类型。 现在,我认为这些功能不仅限于Nullable<T>
:
switch
的值可以是可空类型。 我认为这不重要,因为switch也接受可以在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.