объект 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;

это работает.