2012-12-10 7 views
15

可能性の重複:
Nullable type as a generic parameter possible?なぜNULL可能<T>は、一般的な制約のために参照型と一致していません

私は、ジェネリック型の制約で非常に奇妙なことに出くわしました。私はint?は参照でなければならないというエラーが出る

new SomeClass<int?>(); 

public SomeClass<T> where T:class 
{ 
} 

は、しかし、私が期待するように私がNULL可能なタイプを使用することはできません、私を見つけた:私はこのようなクラスを持っていますタイプ。 Nullableは、参照型のように見えるように構文上の砂糖を持つ構造体にすぎませんか?

+2

この制約の理由は何ですか?より多くの文脈を提供できますか? FYI Nullableは次のように宣言されています: 'public struct Nullable where T:struct' –

+0

@SimonWhitehead基本的に、このクラスの値型を使用すると予期しない動作と大きなパフォーマンスの影響を受ける可能性があります – Earlz

+1

次に正直答えは"はい、Nullableは構造体 "である。私はあなたがNullableの構文的な砂糖であると考えているものはあまりよく分かりません。あなたの唯一の選択肢は、自分のロールを出すことです。 –

答えて

20

Nullable<T>があるstructMSDNを参照)しかし、それはstruct制約を満たしていないだけでstructです。したがって、classまたはstructのいずれかの制約が使用されている場合は、汎用タイプのパラメータとしてNullableを使用できません。

Nullable<T>は、単なる構造糖である構造体ではありません。 CLRには、その動作の一部について特別なサポートがあります。例えば、それは特別なボクシングの振る舞いを持っています。具体的には、nullableはボックス化されません。基本値はボックス化されています。ヌル値がヌル値(HasValueがfalse)の場合、ヌル参照に変換されます。また、Nullable<T>Nullable<U>のコンバージョン演算子は、TからUへのコンバージョンを解除しています。これらは、.NET 1.0/1.1で自分で実装することができない機能です。

関連する問題