Expresión condicional con tipo de destinoTarget-Typed Conditional Expression

Conversión de expresiones condicionalesConditional Expression Conversion

Para una expresión condicional c ? e1 : e2 , cuandoFor a conditional expression c ? e1 : e2, when

  1. no hay ningún tipo común para e1 y e2 , othere is no common type for e1 and e2, or
  2. para el que existe un tipo común pero una de las expresiones e1 o e2 no tiene ninguna conversión implícita a ese tipofor which a common type exists but one of the expressions e1 or e2 has no implicit conversion to that type

definimos una nueva conversión de expresión condicional implícita que permite una conversión implícita de la expresión condicional a cualquier tipo T para el que haya una conversión de expresión from e1 a T y también de e2 a T .we define a new implicit conditional expression conversion that permits an implicit conversion from the conditional expression to any type T for which there is a conversion-from-expression from e1 to T and also from e2 to T. Es un error si una expresión condicional no tiene un tipo común entre e1 y e2 no está sujeto a una conversión de expresión condicional.It is an error if a conditional expression neither has a common type between e1 and e2 nor is subject to a conditional expression conversion.

Mejor conversión de la expresiónBetter Conversion from Expression

CambiamosWe change

Mejor conversión de la expresiónBetter conversion from expression

Dada una conversión implícita C1 que convierte de una expresión E a un tipo T1 , y una conversión implícita C2 que convierte de una expresión E a un tipo T2 , C1 es una conversión mejor que C2 si E no coincide exactamente con T2 y al menos uno de los siguientes elementos:Given an implicit conversion C1 that converts from an expression E to a type T1, and an implicit conversion C2 that converts from an expression E to a type T2, C1 is a better conversion than C2 if E does not exactly match T2 and at least one of the following holds:

toto

Mejor conversión de la expresiónBetter conversion from expression

Dada una conversión implícita C1 que convierte de una expresión E a un tipo T1 , y una conversión implícita C2 que convierte de una expresión E a un tipo T2 , C1 es una conversión mejor que C2 si E no coincide exactamente con T2 y al menos uno de los siguientes elementos:Given an implicit conversion C1 that converts from an expression E to a type T1, and an implicit conversion C2 that converts from an expression E to a type T2, C1 is a better conversion than C2 if E does not exactly match T2 and at least one of the following holds:

  • Ecoincide exactamente con T1 (expresión de coincidencia exacta)E exactly matches T1 (Exactly matching Expression)
  • **C1no es una conversión de expresión condicional y C2 es una conversión de expresión condicional * * * *.**C1 is not a conditional expression conversion and C2 is a *conditional expression conversion***.
  • T1es un destino de conversión mejor que T2 (mejor destinode la conversión) * * y C1 y C2 son ambas conversiones de expresiones condicionales o ninguna es una conversión de expresión condicional * * * *.T1 is a better conversion target than T2 (Better conversion target) **and either C1 and C2 are both conditional expression conversions or neither is a *conditional expression conversion***.

Expresión de conversiónCast Expression

La especificación del lenguaje C# actual indicaThe current C# language specification says

Cast_expression del formulario (T)E , donde T es un tipo y E es un unary_expression, realiza una conversión explícita (conversiones explícitas) del valor de E en el tipo T .A cast_expression of the form (T)E, where T is a type and E is a unary_expression, performs an explicit conversion (Explicit conversions) of the value of E to type T.

En presencia de la conversión de expresión condicional , puede haber más de una conversión posible de E a T .In the presence of the conditional expression conversion there may be more than one possible conversion from E to T. Con la adición de la conversión de expresiones condicionales, se prefiere cualquier otra conversión a una conversión de expresión condicionaly se usa la conversión de expresión condicional solo como último recurso.With the addition of conditional expression conversion, we prefer any other conversion to a conditional expression conversion, and use the conditional expression conversion only as a last resort.

Notas de diseñoDesign Notes

El motivo por el que el cambio es una mejor conversión de Expression es controlar un caso como este:The reason for the change to Better conversion from expression is to handle a case such as this:

M(b ? 1 : 2);

void M(short);
void M(long);

Este enfoque tiene dos pequeñas desventajas.This approach does have two small downsides. En primer lugar, no es exactamente igual que la expresión Switch:First, it is not quite the same as the switch expression:

M(b ? 1 : 2); // calls M(long)
M(b switch { true => 1, false => 2 }); // calls M(short)

Esto sigue siendo un cambio importante, pero es menos probable que su ámbito afecte a programas reales:This is still a breaking change, but its scope is less likely to affect real programs:

M(b ? 1 : 2, 1); // calls M(long, long) without this feature; ambiguous with this feature.

M(short, short);
M(long, long);

Esto se convierte en ambiguo porque la conversión a long es mejor para el primer argumento (porque no usa la conversión de expresión condicional), pero la conversión a short es mejor para el segundo argumento (porque short es un destino de conversión mejor que long ).This becomes ambiguous because the conversion to long is better for the first argument (because it does not use the conditional expression conversion), but the conversion to short is better for the second argument (because short is a better conversion target than long). Este cambio importante parece menos grave porque no cambia silenciosamente el comportamiento de un programa existente.This breaking change seems less serious because it does not silently change the behavior of an existing program.

La razón de las notas de la expresión de conversión es controlar un caso como este:The reason for the notes on the cast expression is to handle a case such as this:

_ = (short)(b ? 1 : 2);

Este programa usa actualmente la conversión explícita de int a short y queremos conservar el significado del lenguaje actual de este programa.This program currently uses the explicit conversion from int to short, and we want to preserve the current language meaning of this program. El cambio no se observará en tiempo de ejecución, pero con el siguiente programa el cambio sería observable:The change would be unobservable at runtime, but with the following program the change would be observable:

_ = (A)(b ? c : d);

donde c es de tipo C , d es de tipo D y hay una conversión implícita definida por el usuario de C a D , y una conversión implícita definida por el usuario de D a A , y una conversión implícita definida por el usuario de C a A .where c is of type C, d is of type D, and there is an implicit user-defined conversion from C to D, and an implicit user-defined conversion from D to A, and an implicit user-defined conversion from C to A. Si este código se compila antes que C# 9,0, cuando b es true, se convierte de c a D a continuación en A .If this code is compiled before C# 9.0, when b is true we convert from c to D then to A. Si usamos la conversión de expresión condicional, cuando b es true, se convierte de c a A directamente, que ejecuta una secuencia diferente de código de usuario.If we use the conditional expression conversion, then when b is true we convert from c to A directly, which executes a different sequence of user code. Por lo tanto, se trata la conversión de expresión condicional como último recurso en una conversión para conservar el comportamiento existente.Therefore we treat the conditional expression conversion as a last resort in a cast, to preserve existing behavior.