Iif эквивалент в С#

Есть ли эквивалент IIf в C#? Или аналогичный ярлык?

Ответ 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() который работает как оператор С#. Он использует вывод типа, чтобы знать, что он возвращает, и это действительно оператор, а не функция. Это означает, что нет проблем с предварительными вычислениями, хотя у них есть семантика функций.

Ответ 2

VB.NET:

If(someBool, "true", "false")

С#

someBool ? "true" : "false";

Ответ 3

тернарный оператор

bool a = true;

string b = a ? "if_true" : "if_false";

Ответ 4

Также полезен оператор коалесценции:

VB:

Return Iif( s IsNot Nothing, s, "My Default Value" )

С#:

return s ?? "My Default Value";

Ответ 6

Это тернарный оператор ?

string newString = i == 1 ? "i is one" : "i is not one";

Ответ 7

Он ограничен тем, что вы не можете размещать там заявления. Вы можете только поместить значения (или вещи, возвращающие/оценивающие значения), чтобы вернуть

Это работает ('a' является статическим int внутри класса Blah)

Blah.a=Blah.a<5?1:8;

(круглые скобки неявно между равными и вопросительным знаком).

Это не работает.

Blah.a = Blah.a < 4 ? Console.WriteLine("asdf") : Console.WriteLine("34er");
or
Blah.a = Blah.a < 4 ? MessageBox.Show("asdf") : MessageBox.Show("34er");

Таким образом, вы можете использовать только трёхмерный оператор С# для возврата значений. Так что это не совсем похоже на укороченную форму if. Javascript и, возможно, некоторые другие языки позволяют размещать там заявления.