Почему я не могу объявить общий список как NULL?
Я пытаюсь использовать следующий код:
private Nullable<List<IpAddressRange>> ipAddressRangeToBind;
Но я получаю следующее предупреждение:
Список типов должен быть типом с непустым значением в чтобы использовать его в качестве параметра "Т" в общем типе или методе 'System.Nullable'.
Ответы
Ответ 1
List<T>
уже является ссылочным типом (для любого типа T
) - вы можете объявлять только Nullable<T>
, где T
- тип значения, который не является нулевым (он объявлен как Nullable<T> where T : struct
).
Но это нормально, потому что если вы просто объявите:
private List<IpAddressRange> ipAddressRangeToBind;
то вы все равно можете
ipAddressRangeToBind = null;
поскольку ссылочные типы всегда имеют значение NULL.
Ответ 2
List<IpAddressRange>
является ссылочным типом - он уже обнуляется - на самом деле он будет инициализирован нулем этой декларацией.
Ответ 3
Вы можете просто использовать его как есть:
List<IpAddressRange> ipAddressRangeToBind = null;
Список уже обнуляется.
Ответ 4
Типы ссылок не могут быть обернуты в Nullable<T>
из-за ограничения where T : struct
на общий.
Причины этого ограничения:
- Ссылочные типы уже обнуляются по определению, а
- Nullable не очень эффективен с точки зрения пространства, но более "логическая" ошибка.
Nullable<T>
имеет свойство bool HasValue
и свойство T
типа T
, которое содержит фактическое значение типа значения.
Даже если HasValue == false
(то есть, если обнуленная оберточная переменная имеет значение null
), вы STILL потребляете пространство для типа значения, как если бы оно было там.
Он логически недействителен, чтобы вы могли указывать дополнительное поведение, но оно не сохраняет пробела. Это очень похоже на то, как boost:: optional работает на С++.