Target-Typed expresión condicionalTarget-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
- no hay ningún tipo común para
e1ye2, othere is no common type fore1ande2, or - para el que existe un tipo común pero una de las expresiones
e1oe2no tiene ninguna conversión implícita a ese tipofor which a common type exists but one of the expressionse1ore2has 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
C1que convierte de una expresiónEa un tipoT1, y una conversión implícitaC2que convierte de una expresiónEa un tipoT2,C1es una conversión mejor queC2siEno coincide exactamente conT2y al menos uno de los siguientes elementos:Given an implicit conversionC1that converts from an expressionEto a typeT1, and an implicit conversionC2that converts from an expressionEto a typeT2,C1is a better conversion thanC2ifEdoes not exactly matchT2and at least one of the following holds:
Ecoincide exactamente conT1(expresión de coincidencia exacta)Eexactly matchesT1(Exactly matching Expression)T1es un destino de conversión mejor queT2(mejor destinode la conversión)T1is a better conversion target thanT2(Better conversion target)
ento
Mejor conversión de la expresiónBetter conversion from expression
Dada una conversión implícita
C1que convierte de una expresiónEa un tipoT1, y una conversión implícitaC2que convierte de una expresiónEa un tipoT2,C1es una conversión mejor queC2siEno coincide exactamente conT2y al menos uno de los siguientes elementos:Given an implicit conversionC1that converts from an expressionEto a typeT1, and an implicit conversionC2that converts from an expressionEto a typeT2,C1is a better conversion thanC2ifEdoes not exactly matchT2and at least one of the following holds:
Ecoincide exactamente conT1(expresión de coincidencia exacta)Eexactly matchesT1(Exactly matching Expression)- **
C1no es una conversión de expresión condicional yC2es una conversión de expresión condicional * * * *.**C1is not a conditional expression conversion andC2is a *conditional expression conversion***.T1es un destino de conversión mejor queT2(mejor destinode la conversión) * * yC1yC2son ambas conversiones de expresiones condicionales o ninguna es una conversión de expresión condicional * * * *.T1is a better conversion target thanT2(Better conversion target) **and eitherC1andC2are 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, dondeTes un tipo yEes un unary_expression, realiza una conversión explícita (conversiones explícitas) del valor deEen el tipoT.A cast_expression of the form(T)E, whereTis a type andEis a unary_expression, performs an explicit conversion (Explicit conversions) of the value ofEto typeT.
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 condicional y 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.