2012-05-09 27 views
6

的“协方差”当我们有两个结构,一个可以隐式转换到另一个时,那么看起来两个版本System.Nullable<>也可以隐式转换。类似地,如果结构A具有隐式转换为结构B,那么A?也转换为B?System.Nullable <> struct

下面是一个例子:

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/

回答

6

但它是安全的假设,它也将用户定义的隐式转换工作?

是的。从C#4规范的6.4.2节:

给定一个用户定义的转换运算符从一个非空值类型S convers到非空值类型T,一个提升转换运算符存在从S?转换为T?。此提升转换操作者进行解缠从S?S随后从ST用户定义的转换,接着进行包裹从TT?,不同之处在于一个空值S?直接转换到一个空值T?

提升的转换运算符与其基础用户定义的转换运算符具有相同的隐式或显式分类。术语“用户定义的转换”适用于使用用户定义的和提升的转换运算符。

+4

你有没有时间看这些报价,或者你只是手工打字? – Blindy

+0

@Bindind:都!我在我的办公桌上有规格的硬拷贝,我通过输入...复制了本节,因此任何错别字! –

+0

嗯,我错过了第6.4.2节,只读过6.1.4。谢谢。 –

相关问题