Различие состоит в том, что ?:
и If()
являются операторами . IIf()
не является оператором; это простая старая функция. Вы даже можете реализовать это самостоятельно:
Public Shared Function IIf(ByVal Expression As Boolean, ByVal TruePart As Object, ByVal FalsePart As Object) As Object
If Expression Then Return TruePart Else Return FalsePart
End Function
Это означает, что все аргументы, переданные функции, должны быть оценены до вызова функции, как и любая другая функция. Внутри IIF () нет ничего, что вызывало бы исключение & mdash; это просто нормальный процесс оценки аргументов, передаваемых в функцию.
Вы также должны заметить, что вполне нормально передавать null / Nothing в функцию. Вы видели исключение в своем коде, поскольку передаваемое вами выражение содержало нулевую ссылку, которую нельзя было оценить & mdash; скажем, если вы сделали что-то подобное, попробуйте использовать свойство .Length переменной NULL.
Оператор If (), с другой стороны, не имеет этой проблемы, потому что это просто: оператор Более того, это оператор, который использует преимущества оценки короткого замыкания, так что нужно только возвращаемое выражение оценены. If () также имеет приятное преимущество, заключающееся в том, что он безопасен для типов, хотя при желании вы можете повторить безопасность типов и в общей функции IIF (Of T) ().