Jep*_*sen 6 c# nullable covariance
当我们有两个结构,一个可以隐式转换为另一个结构时,那么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;
}
}
Run Code Online (Sandbox Code Playgroud)
里面有些方法:
MyNumber? nmn = new MyNumber(42);
int? covariantMagic = nmn; // works!
Run Code Online (Sandbox Code Playgroud)
在C#语言规范版本4.0中,我们读到了"预定义的隐式标识和数字转换"应存在这样的转换.
但是,假设它也可以用于用户定义的隐式转换,这是否安全?
(这个问题可能与此错误有关:http://connect.microsoft.com/VisualStudio/feedback/details/642227/)
但是,假设它也可以用于用户定义的隐式转换,这是否安全?
是.从C#4规范的第6.4.2节:
鉴于从非空值类型convers用户定义的转换运算符
S
到一个非空值类型T
,一个提升转换运算符存在从转换S?
到T?
.此提升转换运算符执行从解包S?
到S
随后从用户定义的转换S
,以T
从,随后缠绕T
到T?
,不同的是一个空值S?
直接转换到一个空值T?
.提升转换运算符与其基础用户定义转换运算符具有相同的隐式或显式分类.术语"用户定义的转换"适用于用户定义和提升转换运算符的使用.