IIF эквивалент в c#

есть IIf в эквиваленте C#? Или подобный ярлык?

7 ответов


C# имеет "?- троичный оператор, как и другие языки в стиле С. Однако это не вполне эквивалентно iif. Есть два важных отличия.

чтобы объяснить первое, это iif() вызов вызовет исключение DivideByZero, даже если выражение истинно, потому что iif - это просто функция и все аргументы должны быть оценены перед вызовом:

iif(true, 1, 1/0)

другими словами, iif делает не короткое замыкание в традиционном смысле, как показывает ваш вопрос. С другой стороны, это троичное выражение делает и так прекрасно:

(true)?1:1/0;

другая разница в том, что iif не является типобезопасным. Он принимает и возвращает аргументы типа object. Тернарный оператор использует вывод типа, чтобы узнать, с каким типом он имеет дело. Обратите внимание, что вы можете исправить это очень легко с помощью общей реализации, но из коробки это так.

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


VB.NET:

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

C#

someBool ? "true" : "false";

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

bool a = true;

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

также полезен оператор coalesce ??:

В. Б.:

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

C#:

return s ?? "My Default Value";

booleanExpression ? trueValue : falseValue;

пример:

string itemText = count > 1 ? "items" : "item";

http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html


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

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

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

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

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

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

это не сработает.

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

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