C # Nullable, почему object.HasValue возможно, если объект null? [Дубликат]

Для вашего проекта iOS вы можете использовать Route-Me ( link ). Это структура с открытым исходным кодом, которая в значительной степени обеспечивает те же функции, что и MapKit, но позволяет интегрировать различные источники карт (например, Open Street Map, Cloudmade и т. Д.). Насколько я знаю, это единственная альтернатива, которую вы используете в iOS.

Для Android существуют различные альтернативы, которые позволяют использовать альтернативные источники карт. См. эту ссылку для хорошего списка опций.

18
задан Nathan 3 February 2010 в 19:58
поделиться

5 ответов

Технически «ndate» не является нулевым - это тип значения, при этом его значение указано как null.

Когда вы пишете DateTime?, это просто сокращение для Nullable<DateTime> , который является структурой. Нет никакого способа для этого технически быть нулевым, поскольку это не ссылочный тип.

40
ответ дан Reed Copsey 27 August 2018 в 23:01
поделиться
  • 1
    +1 лучший информация. – JonH 3 February 2010 в 20:02
  • 2
    Я предполагаю, что (ndate == null) работает через перегруженный оператор? – Nathan 3 February 2010 в 20:06
  • 3
    @Nathan true 15 символов – JonH 3 February 2010 в 20:08
  • 4
    @ Натан: Да. Компилятор просто инициализирует его новым Nullable & lt; T & gt ;, который по умолчанию помечен как null. – Reed Copsey 3 February 2010 в 20:15

Nullable<T> является структурой, в основном она не может удерживать значение null.

Ваше назначение, фактически скомпилировано во что-то, что выглядит так:

Nullable<DateTime> ndate = new Nullable<DateTime>();

В другом примере выражение:

int? a = null;

Генерирует следующий IL:

.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0)
IL_0000:  ldloca.s   V_0
IL_0002:  initobj    valuetype [mscorlib]System.Nullable`1<int32>

Вызов операции initobj , который инициализирует каждое поле типа значения по указанному адресу нулевой ссылке или 0 соответствующего примитивного типа.

В заключение, что здесь происходит, это инициализация struct по умолчанию .

7
ответ дан CMS 27 August 2018 в 23:01
поделиться

Я бы ожидал, что NullReferenceException

Не существует никакой ссылки [null] , поэтому «NullReferenceException» не следует ожидать. Нулевая дататайт не является нулевой ссылкой . Это нулевое значение .

Однако, поскольку ndate равно null, как выполняется вызов свойства, поскольку нет объекта для вызова свойства HasValue?

Вопрос предполагает ложную предпосылку. Есть объект. Существует нулевое значение DateTime, представляющее нулевое значение нулевой DateTime. Это значение является объектом.

Рассмотрим ваш код:

DateTime? ndate = null; 
Console.WriteLine(ndate.HasValue); 

Это всего лишь короткий способ написать то, что логически похоже:

DateTime ndate = default(DateTime); 
bool ndateHasValue = false;
Console.WriteLine(ndateHasValue); 

Тип с нулевым значением - это просто приятный способ написать код, который означает «пожалуйста, приложите булеву к этой вещи, которая отслеживает, является ли она логически нулевой или нет».

6
ответ дан Eric Lippert 27 August 2018 в 23:01
поделиться

Синтаксический сахар мой друг ... компилятор превращает этот .HasValue в код, который не будет генерировать исключение: -)

-4
ответ дан Joel Martinez 27 August 2018 в 23:01
поделиться
  • 1
    Не совсем верно - переменная ndate технически никогда не "null" поскольку это тип значения и не может быть нулевым. Он имеет значение null, что сильно отличается. – Reed Copsey 3 February 2010 в 20:03
  • 2
    Фактически, компилятор превращает ndate = null в ndate = new Nullable<DateTime>() – Greg 3 February 2010 в 20:03

Что действительно происходит, так это то, что фактическая (не нулевая) структура Nullable назначается переменной, поэтому переменная не равна null, но имеет значение.

2
ответ дан tvanfosson 27 August 2018 в 23:01
поделиться
  • 1
    Ну ... действительно, даже его значение не является нулевым, так как Nullable<T> имеет ограничение where T : struct, правильно? Я бы предположил, что это всего лишь флаг внутри. – Dan Tao 3 February 2010 в 20:05
Другие вопросы по тегам:

Похожие вопросы: