2012-01-04 18 views
11

Supongamos que tengo estas dos funciones sobrecargadas.Método de sobrecarga. ¿Como funciona?

public static void Main(string[]args) 
{ 
    int x=3; 
    fn(x); 
} 

static void fn(double x) 
{ 
    Console.WriteLine("Double"); 
} 

static void fn(float x) 
{ 
    Console.WriteLine("Float"); 
} 

¿Por qué el compilador elegirá la función de flotación?

Respuesta

22

Sigue las reglas de la sección 7.5.3.2 de la especificación C# 4.

int es convertir implícitamente tanto a float y double, por lo que ambos métodos son candidatos aplicable. Sin embargo, la conversión de int a float es "mejor que" la conversión de int a double según la sección 7.5.3.2-7.5.3.5:

Dados dos tipos diferentes T1 y T2, T1 es un objetivo de conversión mejor que T2 si al menos una de las siguientes bodegas:

  • una conversión implícita de T1 a T2 existe

    , y no existe ninguna conversión implícita de T2 a T1
  • ... [irrelevante en este caso]

Aquí, hay una conversión implícita de float a double, pero sin conversión implícita de double a float - por lo float es un objetivo de conversión mejor que double.

+0

mejor significa qué? el tamaño es más cerca? –

+1

@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. –

+1

@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

11

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.

+0

M (nulo) no es una llamada ambigua? –

+1

@sleimanjneidi: No, acabo de decir por qué no es ambiguo. Hay tres métodos aplicables. El más específico gana. Si, por ejemplo, los métodos fueran M (cadena), M (jirafa) y M (int?) Entonces M (nulo) sería ambiguo porque cadena, jirafa e int? no son más o menos específicos que los demás. –

Cuestiones relacionadas