Для вашего проекта iOS вы можете использовать Route-Me ( link ). Это структура с открытым исходным кодом, которая в значительной степени обеспечивает те же функции, что и MapKit, но позволяет интегрировать различные источники карт (например, Open Street Map, Cloudmade и т. Д.). Насколько я знаю, это единственная альтернатива, которую вы используете в iOS.
Для Android существуют различные альтернативы, которые позволяют использовать альтернативные источники карт. См. эту ссылку для хорошего списка опций.
Технически «ndate» не является нулевым - это тип значения, при этом его значение указано как null.
Когда вы пишете DateTime?
, это просто сокращение для Nullable<DateTime>
, который является структурой. Нет никакого способа для этого технически быть нулевым, поскольку это не ссылочный тип.
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 по умолчанию .
Я бы ожидал, что NullReferenceException
blockquote>Не существует никакой ссылки [null] , поэтому «NullReferenceException» не следует ожидать. Нулевая дататайт не является нулевой ссылкой . Это нулевое значение .
Однако, поскольку ndate равно null, как выполняется вызов свойства, поскольку нет объекта для вызова свойства HasValue?
blockquote>Вопрос предполагает ложную предпосылку. Есть объект. Существует нулевое значение DateTime, представляющее нулевое значение нулевой DateTime. Это значение является объектом.
Рассмотрим ваш код:
DateTime? ndate = null; Console.WriteLine(ndate.HasValue);
Это всего лишь короткий способ написать то, что логически похоже:
DateTime ndate = default(DateTime); bool ndateHasValue = false; Console.WriteLine(ndateHasValue);
Тип с нулевым значением - это просто приятный способ написать код, который означает «пожалуйста, приложите булеву к этой вещи, которая отслеживает, является ли она логически нулевой или нет».
Синтаксический сахар мой друг ... компилятор превращает этот .HasValue в код, который не будет генерировать исключение: -)
ndate = null
в ndate = new Nullable<DateTime>()
– Greg
3 February 2010 в 20:03
Что действительно происходит, так это то, что фактическая (не нулевая) структура Nullable назначается переменной, поэтому переменная не равна null, но имеет значение.
Nullable<T>
имеет ограничение where T : struct
, правильно? Я бы предположил, что это всего лишь флаг внутри.
– Dan Tao
3 February 2010 в 20:05