0

Я использую VB.NET MVC 5.1 в VS2013 используя RazorДесятичный? - Nullable объект должен иметь значение

siq.Price является Десятичный?

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

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

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

Сведения об исключении: System.InvalidOperationException: Nullable object должен иметь значение.

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

@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.Value.ToString("C") 
+0

Что такое 'siq'? Как это определяется? –

+1

Возможный дубликат [VB.NET - IIF (,,) - оцениваются обе «стороны». В каких ситуациях я должен следить?] (Http: // stackoverflow.com/questions/1220411/vb-net-iif-both-sides-are-evaluation-what-situation-should-i-watch-ou) – CodeCaster

ответ

5

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

@If(siq.Price.HasValue, siq.Price.Value.ToString("C"), "N/A") 
1

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

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

+0

Благодарим за ваш быстрый ответ и полезную информацию. Я соглашусь на другой ответ, хотя я боюсь, поскольку он предлагает решение для кода, а также краткое объяснение. –

0

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

Dim len = If(text Is Nothing, 0, text.Length) 
Смежные вопросы