В описании исключения существует парадокс: объект 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.
Вы должны изменить строку 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
вызывает исключение. Удаление избавляет от исключения. Я думаю, вы ищете не в том месте.
Назначьте элементы напрямую, без части .Value
:
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime;
this.otherdata = myNewDT.otherdata;
}
В этом случае oldDTE имеет значение null, поэтому при попытке доступа к oldDTE.Value возникает исключение InvalidOperationException, поскольку значение отсутствует. В вашем примере вы можете просто сделать:
this.MyDateTime = newDT.MyDateTime;
Looks like oldDTE.MyDateTime was null, so constructor tried to take it's Value - which threw.
Попробуйте удалить .value
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime;
this.otherdata = myNewDT.otherdata;
}