La respuesta de Jon es, por supuesto, correcta. Para agregar un poco más de detalle: el principio de diseño aquí es que el método "más específico" es mejor. Si usted tenía:
void M(object x){}
void M(Animal x){}
void M(Giraffe x){}
y que llamó M(new Giraffe())
, obviamente, le gustaría que la coincidencia exacta. Si llamó al M(new Tiger())
, la mejor coincidencia es "Animal" porque un tigre es un tipo de animal, un tigre es un tipo de objeto, pero el animal es más específico que el objeto. ¿Cómo sabemos que el animal es más específico que el objeto? Porque cada animal es un objeto, pero no todos los objetos son animales, por lo que los animales deben ser más específicos.
Si llamó al M(null)
, por lo tanto, elegimos la versión de jirafa. La jirafa es más específica que Animal porque cada jirafa es un animal, pero no todos los animales son jirafas.
En su ejemplo, flotar es mejor que duplicar porque es más específico. Cada flotador se puede convertir en doble, pero no todos los dobles se pueden convertir en flotantes, por lo que la flotación es más específica. Así como todos los animales se pueden convertir en objetos, pero no todos los objetos se pueden convertir en animales, por lo que los animales son más específicos.
mejor significa qué? el tamaño es más cerca? –
@sleimanjneidi: Mejor significa "mejor según la especificación": es solo un término. Aquí realmente significa "más específico" en algunos sentidos ... pero en realidad debería pensarlo en términos de las reglas de especificación, IMO. –
@JonSkeet: Pregunta rápida en la última oración de su respuesta: ¿Por qué la conversión de 'flotante' a' doble' es relevante? ¿El compilador no tiene que decidir si la conversión de _int a float_ o la conversión de _int a double_ es mejor? – afrischke