Translate

jueves, 25 de junio de 2020

C# 9 viene con mejoras en la inferencia de tipos


Al parecer C# 9 viene con un montón de mejoras, muchas pero una que me llamo la atención es una nueva forma de inferir datos. En realidad no sé si lo esta infiriendo, solamente no lo escribis 2 veces. 

Básicamente es lo opuesto a la palabra clave var. En lugar de omitir el nombre de tipo en la declaración de variable, omite el nombre de tipo en el lado de creación de valor. Veamos un ejemplo:

private Dictionary<string, List<int>> field = new Dictionary<string, List<int>>();
private Dictionary<string, List<int>> field = new(); //Esta es la forma nueva

XmlReader.Create(reader, new XmlReaderSettings() { IgnoreWhitespace = true });
XmlReader.Create(reader, new() { IgnoreWhitespace = true }); //Esta es la forma nueva

Desde la perspectiva del desarrollador, eso es casi todo lo que hay que hacer. La característica elimina el tipo en situaciones en las que es redundante o simplemente no es interesante. Pero desde la perspectiva del diseño del lenguaje hay numerosos temas a considerar.

Por ejemplo, ¿qué debería ocurrir si hay dos sobrecargas viables? ¿Debería el compilador elegir la "mejor" coincidencia, o marcarla como un error ambiguo como lo hace para dos sobrecargas que difieren solo en el tipo de un parámetro de salida?

Según las notas de LDM, Microsoft eligió este último. Parte de la razón es hacer que agregar nuevas sobrecargas sea menos probable que resulte en un cambio radical. Tenga en cuenta la frase "menos probable", ya que este tipo de inferencia de tipo siempre será susceptible a problemas causados ​​por sobrecargas adicionales.

Un problema de diseño de lenguaje común es determinar cuándo filtrar sobrecargas inapropiadas. En el pasado ha habido casos en los que el compilador elegía una sobrecarga, solo para luego emitir un error del compilador porque violaba una restricción de parámetro genérico. Esto se conoce como un "enfoque de filtro tardío" y, aunque simplifica el diseño del compilador, reduce las posibilidades de que el compilador encuentre con éxito una sobrecarga en un fragmento de código arbitrario.

En cambio, un "enfoque de filtro temprano" intentaría eliminar tantas sobrecargas como sea posible antes de elegir una. Nuevamente, esto aumenta la complejidad del compilador a cambio de tener más probabilidades de encontrar una buena coincidencia.