Ответ 1
У С# есть ?
тройной оператор, как и другие языки C-стиля. Однако это не совсем эквивалентно IIf()
; есть два важных отличия.
Чтобы объяснить первое отличие, аргумент false-part для этого IIf()
вызывает DivideByZeroException
, хотя логический аргумент имеет значение True
.
IIf(true, 1, 1/0)
IIf()
- это просто функция, и, как и все функции, все аргументы должны быть оценены до вызова. Другими словами, IIf()
не имеет короткого замыкания в традиционном смысле. С другой стороны, это тернарное выражение делает короткое замыкание, и так прекрасно:
(true)?1:1/0;
Другое отличие: IIf()
не безопасен для типа. Он принимает и возвращает аргументы типа Object
. Тернарный оператор безопасен по типу. Он использует вывод типа, чтобы знать, с какими типами он имеет дело. Обратите внимание, что это можно легко исправить с помощью вашей собственной универсальной реализации IIF(Of T)()
, но из коробки, которая не так, как есть.
Если вы действительно хотите IIf()
в С#, вы можете получить его:
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()
который работает как оператор С#. Он использует вывод типа, чтобы знать, что он возвращает, и это действительно оператор, а не функция. Это означает, что нет проблем с предварительными вычислениями, хотя у них есть семантика функций.