web-dev-qa-db-ja.com

ジェネリックリストをnull許容として宣言できないのはなぜですか?

次のコードを使用しようとしています:

private Nullable<List<IpAddressRange>> ipAddressRangeToBind;

しかし、次の警告が表示されます。

ジェネリック型またはメソッド「System.Nullable」でパラメーター「T」として使用するには、型リストがNULL不可の値型である必要があります。

22
Exitos

List<T>はすでに参照型です(あらゆる種類のT)-宣言できるのはNullable<T>のみです。ここで、Tはnull許容値型ではありません(次のように宣言されています)。 Nullable<T> where T : struct)。

しかし、それは大丈夫です。なぜなら、あなたがただ宣言するなら:

private List<IpAddressRange> ipAddressRangeToBind;

その後、あなたはまだ持つことができます

ipAddressRangeToBind = null;

参照型は常に null許容であるためです。

51
Jon Skeet

List<IpAddressRange>は参照型であり、すでにnull可能です。実際、その宣言によってnullに初期化されます。

10
Cade Roux

そのまま使用できます。

List<IpAddressRange> ipAddressRangeToBind = null;  

リストはすでにnull許容です。

6
Roee Gavirel

ジェネリックのNullable<T>制約のため、参照型をwhere T : structでラップすることはできません。

この制約の理由は次のとおりです。

  1. 参照型は定義上すでにnull許容であり、
  2. Nullableはスペース効率があまり良くありませんが、より「論理的な」null可能性です。

Nullable<T>にはboolプロパティHasValueと、実際の値型の値を含む型TプロパティValueがあります。

HasValue == false(つまり、null許容のラップされた変数がnullに設定されている場合)でも、値型のスペースをあたかもそこにあるかのように消費します。

論理的に null許容で、オプションの動作を指定できますが、スペースを節約できません。これは、C++でboost :: optionalがどのように機能するかと非常によく似ています。

4