次のコードを使用しようとしています:
private Nullable<List<IpAddressRange>> ipAddressRangeToBind;
しかし、次の警告が表示されます。
ジェネリック型またはメソッド「System.Nullable」でパラメーター「T」として使用するには、型リストがNULL不可の値型である必要があります。
List<T>
はすでに参照型です(あらゆる種類のT
)-宣言できるのはNullable<T>
のみです。ここで、T
はnull許容値型ではありません(次のように宣言されています)。 Nullable<T> where T : struct
)。
しかし、それは大丈夫です。なぜなら、あなたがただ宣言するなら:
private List<IpAddressRange> ipAddressRangeToBind;
その後、あなたはまだ持つことができます
ipAddressRangeToBind = null;
参照型は常に null許容であるためです。
List<IpAddressRange>
は参照型であり、すでにnull可能です。実際、その宣言によってnullに初期化されます。
そのまま使用できます。
List<IpAddressRange> ipAddressRangeToBind = null;
リストはすでにnull許容です。
ジェネリックのNullable<T>
制約のため、参照型をwhere T : struct
でラップすることはできません。
この制約の理由は次のとおりです。
Nullable<T>
にはboolプロパティHasValue
と、実際の値型の値を含む型T
プロパティValue
があります。
HasValue == false
(つまり、null許容のラップされた変数がnull
に設定されている場合)でも、値型のスペースをあたかもそこにあるかのように消費します。
論理的に null許容で、オプションの動作を指定できますが、スペースを節約できません。これは、C++でboost :: optionalがどのように機能するかと非常によく似ています。