6

2つの構造体があり、一方が暗黙的にもう一方に変換可能である場合System.Nullable<>、2つのバージョンも暗黙的に変換可能であるように見えます。同様に、structAにstructへの暗黙の変換がある場合、同様にBA?変換さ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では、「事前定義された暗黙のIDと数値の変換」に対してこのような変換が存在する必要があることを読みました。

しかし、ユーザー定義の暗黙的な変換でも機能すると想定しても安全ですか?

(この質問はこのバグに関連している可能性があります:http://connect.microsoft.com/VisualStudio/feedback/details/642227/

4

1 に答える 1

6

しかし、ユーザー定義の暗黙的な変換でも機能すると想定しても安全ですか?

はい。C#4仕様のセクション6.4.2から:

Sヌル不可能な値型からヌル不可能な値型に変換するユーザー定義の変換演算子が与えられると、からに変換Tするリフトされた変換演算子が存在しS?ますT?S?このリフトされた変換演算子は、からへのアンラップ、Sその後へのユーザー定義の変換、SへへTのラッピングを実行Tします。ただし、null値が直接T?null値に変換される場合を除きます。S?T?

リフトされた変換演算子には、基礎となるユーザー定義の変換演算子と同じ暗黙的または明示的な分類があります。「ユーザー定義の変換」という用語は、ユーザー定義の変換演算子とリフトされた変換演算子の両方の使用に適用されます。

于 2012-05-09T14:36:35.163 に答える