В описании исключения есть парадокс: обнуляемый объект должен иметь значение (?!)
Это проблема:
У меня есть DateTimeExtended
класс, который имеет
{
DateTime? MyDataTime;
int? otherdata;
}
и конструктор
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime.Value;
this.otherdata = myNewDT.otherdata;
}
работает этот код
DateTimeExtended res = new DateTimeExtended(oldDTE);
Кидает InvalidOperationException
с сообщением:
Обнуляемый объект должен иметь значение.
myNewDT.MyDateTime.Value
- действителен и содержит обычный DateTime
объект.
В чем смысл этого сообщения и что я делаю не так?
Обратите внимание, что oldDTE
это не так null
. Я удалил Value
из, myNewDT.MyDateTime
но то же исключение выдается из-за сгенерированного сеттера.
Ответы:
Вы должны изменить строку
this.MyDateTime = myNewDT.MyDateTime.Value;
простоthis.MyDateTime = myNewDT.MyDateTime;
Исключение, которое вы получили, было брошено в
.Value
собственность NullableDateTime
, так как требуется вернутьDateTime
(поскольку это то, что является контрактом для.Value
государств), но это не может быть сделано, потому что нетDateTime
возврата, поэтому оно выдает исключение.В общем, плохая идея - слепо вызывать
.Value
обнуляемый тип, если у вас нет предварительных знаний о том, что эта переменная ДОЛЖНА содержать значение (т. Е. Посредством.HasValue
проверки).РЕДАКТИРОВАТЬ
Вот код для
DateTimeExtended
этого не исключение:Я проверил это так:
Добавление
.Value
onother.MyDateTime
вызывает исключение. Удаление этого избавляет от исключения. Я думаю, что вы смотрите не в том месте.источник
.Value
для нулевого объекта имеет смысл (я полагаю), но сообщение об исключении действительно вводит в заблуждение, если вы имеете дело с двумя объектами Nullable. Что-то вроде «Свойство .Value требует, чтобы объект был ненулевым», имело бы намного больше смысла.При использовании методов расширения LINQ (например
Select
,Where
) лямбда-функция может быть преобразована в SQL, который может вести себя не так, как ваш код C #. Так , например, короткое замыкание оценивали С #&&
и||
преобразуются в SQL, стремятсяAND
иOR
. Это может вызвать проблемы, когда вы проверяете ноль в своей лямбде.Пример:
источник
Попробуйте сбросить
.value
источник
В этом случае oldDTE имеет значение null, поэтому при попытке доступа к oldDTE.Value генерируется исключение InvalidOperationException, поскольку значение отсутствует. В вашем примере вы можете просто сделать:
источник
Назначьте участников напрямую без
.Value
части:источник
Похоже, что oldDTE.MyDateTime был нулевым, поэтому конструктор попытался принять его значение - что бросило.
источник
Я получил это сообщение при попытке получить доступ к значениям объекта с нулевым значением.
это приведет к ошибке. Сначала вы должны проверить, если объект не нулевой
Это работает.
источник
this.MyDateTime = myNewDT.MyDateTime.Value;
, нетsName = myObj.Name;
Я получил это решение, и оно работает на меня
источник