nullable объект должен иметь значение

В описании исключения существует парадокс: объект Nullable должен иметь значение (?!)

Это - проблема:

У меня есть a 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 - допустимо, и содержите постоянного клиента DateTime объект.

Каково значение этого сообщения и что я делаю неправильно?

Отметьте это oldDTE не null. Я удалил Value от myNewDT.MyDateTime но то же исключение выдается из-за сгенерированного метода set.

172
задан The Red Pea 26 January 2015 в 20:39
поделиться

5 ответов

Вы должны изменить строку this.MyDateTime = myNewDT.MyDateTime.Value; только на this.MyDateTime = myNewDT.MyDateTime;

Полученное вами исключение было сгенерировано в свойстве .Value объекта Nullable DateTime , поскольку требуется для возврата DateTime (поскольку это то, что указано в контракте для .Value ), но он не может этого сделать, потому что там ' s no DateTime для возврата, поэтому возникает исключение.

В общем, это плохая идея - вслепую вызывать .Value для типа, допускающего значение NULL, если у вас нет каких-либо предыдущих знание того, что эта переменная ДОЛЖНА содержать значение (т. е. посредством проверки .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 на ] other.MyDateTime вызывает исключение. Удаление избавляет от исключения. Я думаю, вы ищете не в том месте.

если вы заранее не знаете, что эта переменная ДОЛЖНА содержать значение (например, с помощью проверки .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 на ] other.MyDateTime вызывает исключение. Удаление избавляет от исключения. Я думаю, вы ищете не в том месте.

если вы заранее не знаете, что эта переменная ДОЛЖНА содержать значение (например, с помощью проверки .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 на ] other.MyDateTime вызывает исключение. Удаление избавляет от исключения. Я думаю, вы ищете не в том месте.

184
ответ дан 23 November 2019 в 20:40
поделиться

Назначьте элементы напрямую, без части .Value :

DateTimeExtended(DateTimeExtended myNewDT)
{
   this.MyDateTime = myNewDT.MyDateTime;
   this.otherdata = myNewDT.otherdata;
}
1
ответ дан 23 November 2019 в 20:40
поделиться

В этом случае oldDTE имеет значение null, поэтому при попытке доступа к oldDTE.Value возникает исключение InvalidOperationException, поскольку значение отсутствует. В вашем примере вы можете просто сделать:

this.MyDateTime = newDT.MyDateTime;
2
ответ дан 23 November 2019 в 20:40
поделиться

Looks like oldDTE.MyDateTime was null, so constructor tried to take it's Value - which threw.

0
ответ дан 23 November 2019 в 20:40
поделиться

Попробуйте удалить .value

DateTimeExtended(DateTimeExtended myNewDT)
{
   this.MyDateTime = myNewDT.MyDateTime;
   this.otherdata = myNewDT.otherdata;
}
5
ответ дан 23 November 2019 в 20:40
поделиться
Другие вопросы по тегам:

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