C # имеет троичный оператор ?
, как и другие языки в стиле C. Однако это не совсем эквивалентно IIf()
; Есть два важных различия.
Чтобы объяснить первое различие, аргумент ложной части для этого вызова IIf()
вызывает DivideByZeroException
, хотя логический аргумент - True
.
IIf(true, 1, 1/0)
IIf()
- это просто функция, и, как и все функции, все аргументы должны быть оценены до вызова. Другими словами, IIf()
не делает короткое замыкание в традиционном смысле. С другой стороны, это троичное выражение делает короткое замыкание, и поэтому прекрасно:
(true)?1:1/0;
Другое отличие состоит в том, что IIf()
небезопасен. Он принимает и возвращает аргументы типа Object
. Тернарный оператор является типом . Он использует вывод типов, чтобы знать, с какими типами он имеет дело. Обратите внимание, что вы можете легко исправить это с помощью собственной общей реализации IIF(Of T)()
, но из коробки это не так.
Если вы действительно хотите IIf()
в C #, вы можете получить его:
object IIf(bool expression, object truePart, object falsePart)
{return expression?truePart:falsePart;}
или общая / безопасная для типов реализация:
T IIf<T>(bool expression, T truePart, T falsePart)
{return expression?truePart:falsePart;}
С другой стороны, если вам нужен троичный оператор в VB, Visual Studio 2008 и более поздние версии предоставляют новый If()
оператор , который работает как троичный оператор C #. Он использует вывод типа, чтобы знать, что он возвращает, и это действительно оператор, а не функция. Это означает, что нет проблем с предварительным вычислением выражений, даже если оно имеет семантику функций.