System.Nullable<>的“协方差”结构

时间:2012-05-09 14:33:14

标签: 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;
  }
}

在某些方法中:

MyNumber? nmn = new MyNumber(42);
int? covariantMagic = nmn; // works!

在C#语言规范版本4.0中,我们读到“预定义的隐式标识和数字转换”将存在这样的转换。

可以安全地假设它也适用于用户定义的隐式转换吗?

(这个问题可能与此错误有关:http://connect.microsoft.com/VisualStudio/feedback/details/642227/

1 个答案:

答案 0 :(得分:6)

  

但是,假设它也适用于用户定义的隐式转换是否安全?

是。来自C#4规范的第6.4.2节:

  

如果用户定义的转换运算符从非可空值类型S转换为非可空值类型T,则存在提升转换运算符S?转换为T?。此提升转换运算符会执行从S?S的展开,然后是用户定义的从ST的转换,然后从T换行到T? S?,但空值T?直接转换为空值{{1}}。

     

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