2017-09-08 3 views
0

Nullableクラスはどのようにそれを行いますか?Nullableのような型の名前を "カスタマイズ"するには?

public class Foo<T> 
{ 
    public T Bar { get; set; } 
} 

var n1 = new Nullable<int>(123).GetType().Name; // "Int32" 
var n2 = new Foo<int>().GetType().Name; // "Foo`1" 

Fooは、同じタイプの名前、すなわち「のInt32」を持たせることが可能ですか?

+5

「Nullable」はランタイムによって非常に特別な扱いを受けることに注意してください。特に、値なしの 'Nullable'がボックス化されている場合、ボックス化されたオブジェクトは' null'です - それ以外の値の型とは異なります。私の疑惑は、これと同様の特別扱いだということです。 – cdhowie

+0

も参照してください。GetType()は構造体の型を判別できますか?](https://stackoverflow.com/q/926352/1207195)。 'Nullable 'は 'ValueType'であり、値の型はボックス化されているので、それはあなたが得るものです([Nullable.cs](https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/nullableも参照してください)。 .cs)ソースコード) –

+0

答えは私のコメントと@ AdrianoRepetti'sの組み合わせです。私は答えを草案する。 – cdhowie

答えて

2

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可能なボクシングの結果です。

関連する問題