объект nullable должен иметь значение
в описании исключений есть парадокс: Объект Nullable должен иметь значение (?!)
проблема:
у меня есть DateTimeExtended
класс,
это имеет
{
DateTime? MyDataTime;
int? otherdata;
}
и конструктор
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime.Value;
this.otherdata = myNewDT.otherdata;
}
запуск этого кода
DateTimeExtended res = new DateTimeExtended(oldDTE);
выдает InvalidOperationException
сообщение:
объект Nullable должен иметь значение.
myNewDT.MyDateTime.Value
- действительно и содержит регулярное
7 ответов
вы должны изменить строку this.MyDateTime = myNewDT.MyDateTime.Value;
просто this.MyDateTime = myNewDT.MyDateTime;
исключение, которое вы получали, было брошено в .Value
свойства тип nullable DateTime
, так как требуется вернуть DateTime
(так как это то, что контракт для .Value
состояния), но он не может этого сделать, потому что нет DateTime
для возврата, поэтому он выдает исключение.
вообще, нехорошо вслепую звонить .Value
на nullable типе, если вы имейте некоторые предварительные знания, что эта переменная должны содержать значение (т. е. через .HasValue
Регистрация).
редактировать
здесь код DateTimeExtended
это не вызывает исключения:
class DateTimeExtended
{
public DateTime? MyDateTime;
public int? otherdata;
public DateTimeExtended() { }
public DateTimeExtended(DateTimeExtended other)
{
this.MyDateTime = other.MyDateTime;
this.otherdata = other.otherdata;
}
}
я проверил это так:
DateTimeExtended dt1 = new DateTimeExtended();
DateTimeExtended dt2 = new DateTimeExtended(dt1);
добавлять .Value
on other.MyDateTime
вызывает исключение. Удаление его избавляет от исключения. Я думаю, ты ищешь не в том месте.
при использовании методов расширения LINQ (например,Select
, Where
), лямбда-функция может быть преобразована в SQL, которая может вести себя не идентично вашему коду c#. Например, короткое замыкание c#оценивается ||
и &&
преобразуются в SQL нетерпеливый AND
и OR
. Это может вызвать проблемы, когда вы проверяете значение null в лямбде.
пример:
MyEnum? type = null;
Entities.Table.Where(a => type == null ||
a.type == (int)type).ToArray(); // Exception: Nullable object must have a value
в этом случае oldDTE имеет значение null, поэтому при попытке доступа к oldDTE.Значение исключение InvalidOperationException создается, так как значение отсутствует. В вашем примере вы можете просто сделать:
this.MyDateTime = newDT.MyDateTime;
назначить членов непосредственно без .Value
детали:
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime;
this.otherdata = myNewDT.otherdata;
}
похоже на oldDTE.MyDateTime был null, поэтому конструктор попытался взять его значение-которое бросил.
Я получил это сообщение при попытке доступа к значениям объекта с нулевым значением.
sName = myObj.Name;
это приведет к ошибке. Сначала вы должны проверить, если объект не null
if(myObj != null)
sName = myObj.Name;
это работает.