2012-05-09 25 views
6

2つの構造体があり、1つが暗黙的に他の構造体に変換可能な場合は、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から:

非null許容値型Tに非null許容値型SからCONVERSユーザ定義変換演算子が与えられると、持ち上げ変換演算子が存在しますS?からT?に変換されます。これは、変換演算子を持ち上げS?からヌル値S?がヌル値T?に直接変換することを除いてTからT?に包装続いSからTにユーザ定義の変換、続いSにアンラップを行います。

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

+4

これらの見積もりを見る時間がありますか、手で入力するだけですか? – Blindy

+0

@Blindy:両方!私は机の上に仕様のハードコピーを持っています、そして、私はこのセクションをコピーしました...それで、タイプミス! –

+0

ええと、私はセクション6.4.2を逃して、6.1.4だけを読んでいました。ありがとう。 –

関連する問題