tl; dr:いいえ、Foo
の名前を変更することはできません。 Nullable
と表示されているものは、null値がどのように囲まれているかの副作用です。
はNullable
タイプに関するご覧行動を引き起こして遊んでいくつかあります。
値の型に
.GetType()
を呼び出す
- 値はboxedされます。
Nullable
は、ボクシングに関してランタイムによって特別な扱いを受ける。 をNullable
自体ではなく、箱入りされることはない:
Nullable
は、その値がボックス化された値(この場合int
値123)が含まれている場合。
Nullable
に値が含まれていない場合、ボクシング操作はnull
と評価されます。
結果は、それが実行されたとき(、再び、それは不可能だから)あなたのコードでは、Object.GetType()
は、ない箱入りNullable<int>
オブジェクト箱入りint
値を見ている、ということです。このため、nullableの名前はそのコンテンツの名前と同じです。ヌル、it's an errorとして値ボックスなしのNULL可能にNULL NULL可能で.GetType()
を起動するので、サイドノートとして
new Nullable<int>(123).GetType() == typeof(int)
new Nullable<int>(123).GetType() != typeof(Nullable<int>)
:これは、何が起こっているかを証明する最も簡単な方法です!これは同時に意味があります(それはヌルです、そうですか?)、意味を持たない(値の型です...)は本当にになりません! NULL可能に値がないときは、実装またはNullable
自体(これらの呼び出しはボクシングを必要としないので)でオーバーライドされたメソッドを呼び出すことができますが、がObject
から継承されたとをオーバーライドしていないメソッドを呼び出しませすることができます。
Nullable
には奇妙な二重の性格があり、時にはこのような驚きが生じます。
Nullable
のケースでは、Nullable
が実際に名前を変更していないことがわかりました。表示されるタイプの名前は、null可能なボクシングの結果です。
「Nullable」はランタイムによって非常に特別な扱いを受けることに注意してください。特に、値なしの 'Nullable'がボックス化されている場合、ボックス化されたオブジェクトは' null'です - それ以外の値の型とは異なります。私の疑惑は、これと同様の特別扱いだということです。 – cdhowie
も参照してください。GetType()は構造体の型を判別できますか?](https://stackoverflow.com/q/926352/1207195)。 'Nullable'は 'ValueType'であり、値の型はボックス化されているので、それはあなたが得るものです([Nullable.cs](https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/nullableも参照してください)。 .cs)ソースコード) –
答えは私のコメントと@ AdrianoRepetti'sの組み合わせです。私は答えを草案する。 – cdhowie