Десятичный? - Обнуляемый объект должен иметь значение

Я использую VB.NET MVC 5.1 в VS2013 с помощью Razor

siq.Price является десятичным?

Я пытаюсь проверить, есть ли у siq.Price значение, и если да, то распечатайте его как валюту. Я получаю эту ошибку при попытке доступа к свойству .Value для элементов, где true они вернули true для .HasValue:

Обнуляемый объект должен иметь значение.

Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительных сведений об ошибке и ее происхождении в коде.

Сведения об исключении: System.InvalidOperationException: объект, допускающий значение NULL, должен иметь значение.

Я попробовал обе эти строки кода, полагая, что они должны работать без проблем, но все же получил ошибку выше:

@IIf(siq.Price.HasValue, siq.Price.Value, "N/A")
   'and
@IIf(siq.Price.HasValue, siq.Price.Value.ToString("C"), "N/A")

Как только я удаляю .Value из TruePart, он начинает работать:

@IIf(siq.Price.HasValue, siq.Price, "N/A")
    'and
@IIf(siq.Price.HasValue, String.Format("{0:C}", siq.Price), "N/A")

Кто-нибудь может объяснить, почему это происходит ?! Я довольно озадачен.

ПРИМЕЧАНИЕ. Этот фрагмент кода работает сам по себе, если Price имеет значение, но не в IIf ():

@siq.Price.Value.ToString("C")

person Matthew Hudson    schedule 30.09.2014    source источник
comment
Что такое siq? Как это определяется?   -  person Tomas Aschan    schedule 30.09.2014
comment


Ответы (3)


Функция IIF() в VB.Net всегда оценивает как истинную, так и ложную части. Вместо этого вы должны использовать оператор IF(), который оценивает только возвращаемое значение, например:

@If(siq.Price.HasValue, siq.Price.Value.ToString("C"), "N/A")
person Rowland Shaw    schedule 30.09.2014

На первый взгляд, метод IIf в VB.NET кажется эквивалентным тернарному оператору C # (? :), но есть большая разница: поскольку это метод, а не оператор, короткого замыкания нет, и оба параметра всегда оцениваются перед передачей в метод.

Это означает, что независимо от того, истинно ли HasValue, оцениваются как siq.Price.Value, так и "N/A", что приводит к исключению, которое вы видели.

person Avner Shahar-Kashtan    schedule 30.09.2014
comment
Спасибо за быстрый ответ и полезную информацию. Я приму другой ответ, хотя боюсь, поскольку он предоставляет решение кода, а также краткое объяснение. - person Matthew Hudson; 30.09.2014

IIf () запускает как истинный, так и ложный код. Условный оператор If в VB - это короткое замыкание, поэтому теперь вы можете безопасно написать следующее, что невозможно с помощью функции IIf:

Dim len = If(text Is Nothing, 0, text.Length)
person Isha John    schedule 30.09.2014