Pregunta

En c# puedo hacer algo como esto en una taquigrafía?

 bool validName = true;
 if (validName)
 {
     name = "Daniel";
     surname = "Smith";
 }
 else
 {
     MessageBox.Show("Invalid name");
 }

Me estaba preguntando si algo similar a esto iba a funcionar, pero en este escenario exacto, yo sé que usted puede asignar valores si hice nombre = validName ?"Daniel" :"No válido", pero me preguntaba si puedo hacer lo siguiente?

     validName ? 
     {
         name = "Daniel";
         surname = "Smith";
     } 
     : 
     {
         MessageBox.Show("Invalid name");
     }
¿Fue útil?

Solución

Abusando de lambda sintaxis y la inferencia de tipos:

(validName
    ? (Action)
        (() =>
            {
                name = "Daniel";
                surname = "Smith";
            })
      : () =>
           {
                MessageBox.Show("Invalid name");
           })();

Lo sé, no es realmente una respuesta.Si la instrucción es la forma mejor:obviamente esta sintaxis es menos legible y más importante es que cuenta con diferentes tiempo de ejecución de la conducta y podría dar lugar a efectos secundarios no deseados, debido a los posibles cierres creado por las expresiones lambda.

La sintaxis es un poco críptico demasiado.Primero se crea dos Action los objetos, a continuación, ?: el operador elige entre ellos, y por último el elegido resultado, se ejecuta:

var a1 = new Action(() => { /* if code block */ });
var a2 = new Action(() => { /* else code block */ });

Action resultingAction = test_variable ? a1 : a2;

resultingAction();

Yo, juntos en una declaración mediante la ejecución de la acción que resulte en su lugar.Para hacer aún más breve que tire la primera expresión lambda en un Action (en lugar de crear un new Action() de forma explícita) y tomar ventaja de la inferencia de tipo I a la izquierda el segundo lanzamiento.

Otros consejos

Digamos que podrías hacer eso.¿Por qué?

¿Cuál es la motivación?

Menos líneas?No es suficiente para hacer una diferencia. ¿Actuación?Ninguno, el compilador manejará las cosas para usted. ¿Claridad?Si / el más es más claro y más fácil de entender por la mayoría de los desarrolladores.

Estoy seguro, si trabajaste lo suficiente, podría encontrar una manera de manejar esto (lo más probable es que un kludge), pero todavía no puedo determinar el por qué.

no.

El operador ternario (? :) debe ser, en su conjunto, una expresión, es decir, algo que se puede asignar a algo.

El operador condicional requiere su segundo y tercer operandos a ser expresiones que devuelven un valor (además de cumplir con algunas restricciones de tipo) y no declaraciones que no se resuelven en un valor.Usted no tiene ningún valor que desea devolver a partir de cualquiera de operación que se esté realizando.

Usted podría volver algún sentido de valor por el simple hecho de hacer que el código compile, pero en ese momento vas a agregar una tonelada más trabajo que simplemente el uso de un if que es la correcta semántica del operador para sus necesidades, por lo que si bien es técnicamente posible, no es una buena idea.

fullName = validName == true ? returnName(firstName)+" "+returnName(lastName) : validName == false ? invalidName("Invalid Name") : null


public string returnName(string name)
{
return name;
}

public string invalidName(string invalid)
{
MessageBox.Show(invalid);
return null;
}

Como todos los demás probablemente han dicho, es algo que probablemente no querrá hacer, pero, es posible: P

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