Expresiones de referencia condicionalConditional ref expressions

El patrón de enlazar una variable de referencia a una u otra expresión condicional no se expresa actualmente en C#.The pattern of binding a ref variable to one or another expression conditionally is not currently expressible in C#.

La solución habitual es introducir un método como:The typical workaround is to introduce a method like:

ref T Choice(bool condition, ref T consequence, ref T alternative)
{
    if (condition)
    {
         return ref consequence;
    }
    else
    {
         return ref alternative;
    }
}

Tenga en cuenta que esto no es un reemplazo exacto de ternario, ya que todos los argumentos deben evaluarse en el sitio de llamada.Note that this is not an exact replacement of a ternary since all arguments must be evaluated at the call site.

Lo siguiente no funcionará según lo esperado:The following will not work as expected:

       // will crash with NRE because 'arr[0]' will be executed unconditionally
      ref var r = ref Choice(arr != null, ref arr[0], ref otherArr[0]);

La sintaxis propuesta sería la siguiente:The proposed syntax would look like:

     <condition> ? ref <consequence> : ref <alternative>;

El intento anterior con "Choice" se puede escribir correctamente con Ref ternario como:The above attempt with "Choice" can be correctly written using ref ternary as:

     ref var r = ref (arr != null ? ref arr[0]: ref otherArr[0]);

La diferencia de Choice es que se tiene acceso a las expresiones de consecuencia y alternativas de una manera realmente condicional, por lo que no vemos un bloqueo si arr == nullThe difference from Choice is that consequence and alternative expressions are accessed in a truly conditional manner, so we do not see a crash if arr == null

La referencia ternaria es simplemente un ternario, donde tanto la alternativa como la consecuencia son refs.The ternary ref is just a ternary where both alternative and consequence are refs. De forma natural, será necesario que los operandos de consecuencia/alternativos sean LValues.It will naturally require that consequence/alternative operands are LValues. También se requerirá que la consecuencia y la alternativa tengan tipos que sean convertibles entre sí.It will also require that consequence and alternative have types that are identity convertible to each other.

El tipo de la expresión se calculará de forma similar a la del ternario normal.The type of the expression will be computed similarly to the one for the regular ternary. es decir,.I.E. en caso de que la consecuencia y la alternativa tengan identidad convertible, pero tipos diferentes, se aplicarán las reglas de combinación de tipos existentes.in a case if consequence and alternative have identity convertible, but different types, the existing type-merging rules will apply.

De forma segura a la devolución se asumirán con cautela los operandos condicionales.Safe-to-return will be assumed conservatively from the conditional operands. Si no es seguro devolver todo lo que no es seguro para devolver.If either is unsafe to return the whole thing is unsafe to return.

Ref ternario es un valor l y, como tal, se puede pasar, asignar o devolver por referencia;Ref ternary is an LValue and as such it can be passed/assigned/returned by reference;

     // pass by reference
     foo(ref (arr != null ? ref arr[0]: ref otherArr[0]));

     // return by reference
     return ref (arr != null ? ref arr[0]: ref otherArr[0]);

Ser un valor l; también se puede asignar a.Being an LValue, it can also be assigned to.

    // assign to
    (arr != null ? ref arr[0]: ref otherArr[0]) = 1;

La referencia ternaria se puede usar también en un contexto normal (no Ref).Ref ternary can be used in a regular (not ref) context as well. Aunque no sería común, ya que también podía usar un ternario normal.Although it would not be common since you could as well just use a regular ternary.

     int x = (arr != null ? ref arr[0]: ref otherArr[0]);

Notas de implementación:Implementation notes:

La complejidad de la implementación parece ser el tamaño de una corrección de errores de moderado a grande.The complexity of the implementation would seem to be the size of a moderate-to-large bug fix. -I. E no es muy caro.- I.E not very expensive. No creo que sea necesario realizar cambios en la sintaxis o el análisis.I do not think we need any changes to the syntax or parsing. No hay ningún efecto en los metadatos o la interoperabilidad.There is no effect on metadata or interop. La característica se basa completamente en expresiones.The feature is completely expression based. No hay ningún efecto en la depuración/PDBNo effect on debugging/PDB either