6

当我们有两个结构,并且一个可以隐式转换为另一个时,看起来这两个结构的System.Nullable<>版本也可以隐式转换。就像,如果 structA隐式转换为 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/ )

4

1 回答 1

6

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

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

给定一个用户定义的转换运算符,它从一个不可为空的值类型S转换为一个不可为空的值类型T,一个提升的转换运算符从 转换S?T?。这个提升的转换运算符执行从S?to的展开,S然后是用户定义的从Sto的转换,然后是从toT的包装,除了 null 值直接转换为 null 值。TT?S?T?

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

于 2012-05-09T14:36:35.163 回答