Pregunta

¿Hay un IIf equivalente en C # ? ¿O atajo similar?

¿Fue útil?

Solución

C # tiene el operador ternario ? , como otros lenguajes de estilo C. Sin embargo, esto no es perfectamente equivalente a IIf () ; Hay dos diferencias importantes.

Para explicar la primera diferencia, el argumento de la parte falsa para esta llamada IIf () causa una DivideByZeroException , aunque el argumento booleano es True .

IIf(true, 1, 1/0)

IIf () es solo una función, y como todas las funciones, todos los argumentos deben ser evaluados antes de que se realice la llamada. Dicho de otra manera, IIf () no hace no cortocircuito en el sentido tradicional. Por otro lado, esta expresión ternaria hace cortocircuito, por lo que está perfectamente bien:

(true)?1:1/0;

La otra diferencia es que IIf () no es de tipo seguro. Acepta y devuelve argumentos de tipo Object . El operador ternario es de tipo seguro. Utiliza la inferencia de tipos para saber con qué tipos se trata. Tenga en cuenta que puede solucionarlo muy fácilmente con su propia implementación genérica de IIF (Of T) () , pero no es así.

Si realmente quieres IIf () en C #, puedes tenerlo:

object IIf(bool expression, object truePart, object falsePart) 
{return expression?truePart:falsePart;}

o una implementación genérica / segura para el tipo:

T IIf<T>(bool expression, T truePart, T falsePart) 
{return expression?truePart:falsePart;}

Por otra parte, si desea que el operador ternario en VB, Visual Studio 2008 y posterior proporcione un nuevo operador If () que funcione como el operador ternario de C #. Utiliza la inferencia de tipos para saber qué está devolviendo, y realmente es un operador y no una función. Esto significa que no hay problemas con la evaluación previa de las expresiones, a pesar de que tiene una función semántica.

Otros consejos

VB.NET:

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

C #

someBool ? "true" : "false";

el operador ternario

bool a = true;

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

También es útil el operador de fusión ??:

VB:

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

C #:

return s ?? "My Default Value";
booleanExpression ? trueValue : falseValue;

Ejemplo:

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

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

Es el operador ternario ?

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

Está limitado en que no puedes poner declaraciones allí. Solo puede poner valores (o cosas que devuelvan / evalúen a valores), para devolver

Esto funciona ('a' es un int estático dentro de la clase Blah)

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

(los corchetes redondos se encuentran impíamente entre los iguales y el signo de interrogación).

Esto no funciona.

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

Por lo tanto, solo puede usar el operador c # ternario para devolver valores. Así que no es como una forma abreviada de un if. Javascript y tal vez algunos otros idiomas le permiten poner declaraciones allí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top