[英]“Covariance” of the System.Nullable<> struct
当我们有两个结构,一个可以隐式转换为另一个结构时,那么两者的System.Nullable<>
版本似乎也可以隐式转换。 比如,如果struct A
有一个隐式转换为struct B
,那么A?
转换为B?
同样。
这是一个例子:
struct MyNumber
{
public readonly int Inner;
public MyNumber(int i)
{
Inner = i;
}
public static implicit operator int(MyNumber n)
{
return n.Inner;
}
}
里面有些方法:
MyNumber? nmn = new MyNumber(42);
int? covariantMagic = nmn; // works!
在C#语言规范版本4.0中,我们读到了“预定义的隐式标识和数字转换”应存在这样的转换。
但是,假设它也可以用于用户定义的隐式转换,这是否安全 ?
(这个问题可能与此错误有关: http : //connect.microsoft.com/VisualStudio/feedback/details/642227/ )
但是,假设它也可以用于用户定义的隐式转换,这是否安全?
是。 从C#4规范的第6.4.2节:
给定一个用户定义的转换运算符,该运算符从非可空值类型
S
转换为非可空值类型T
,存在一个转换运算符 ,它从S?
转换为S?
到T?
。 这个提升的转换操作符执行从S?
解包S?
到S
后跟用户定义的从S
到T
转换,然后是从T
到T?
的包装T?
,除了空值S?
直接转换为空值T?
。提升转换运算符与其基础用户定义转换运算符具有相同的隐式或显式分类。 术语“用户定义的转换”适用于用户定义和提升转换运算符的使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.