2009-10-29 10 views
6

Duplicar posible:
C#: Passing null to overloaded method - which method is called?CLR pregunta. ¿Por qué la sobrecarga de métodos en C# decide que null es una cadena?

Aquí es un caso de prueba

object a = null; 
var b = Convert.ToString (null); 
var c = Convert.ToString (a); 
string d = Convert.ToString (null); // CLR chooses Convert.ToString(string value) 
string e = Convert.ToString (a); // CLR chooses Convert.ToString(object value) 

La cuestión es por qué CLR decide que se interpreta como nula cadena en primer caso? Parece que esta pregunta ya fue respondida here

Aquí hay otro caso similar. Ninguno de estos IFS se activan

object x = null; 
if (x is object) 
{ 
    Console.Write ("x is object"); 
} 

if (x is string) 
{ 
    Console.Write ("x is string"); 
} 

if (null is object) 
{ 
    Console.Write ("null is object"); 
} 

if (null is string) 
{ 
    Console.Write ("null is string"); 
} 
+3

Posible duplicado: http://stackoverflow.com/questions/719546/c-pasar-null-to-overloaded-method-which-method-is-llamado – CMS

+0

Supongo que debemos esperar hasta que Jon Skeet se despierte y nos ilumine en este caso. –

+0

Él ya lo tiene, en el enlace que publicó CMS. –

Respuesta

2

La respuesta es porque debe elegir un tipo de referencia (nulo no funciona para los tipos de valor), y cada string es un object, pero no todos los object es una string. See Jon Skeet's answer to this question for more information.

Como respuesta a su segundo ejemplo, si una variable que es nula se pasa a is, siempre se evaluará como falsa, pase lo que pase.

0

En la resolución de sobrecarga, cuando se enfrentan a una elección de la resolución de un parámetro a una clase base o una clase derivada, el compilador siempre elegir la clase más derivada si cabe. Esto permite que las sobrecargas que toman una clase derivada no sean ambiguas con las sobrecargas que toman la clase base. En este caso, como la cadena se deriva de un objeto, se prefiere la cadena.

Para obtener más información, consulte la Sección 7.4.3 en el C# Language Specification. Hay una discusión muy compleja, pero la idea básica es que hay un algoritmo que el compilador utiliza para definir el "mejor" de sobrecarga, y una de las cosas que hace uno mejor que el otro está presente:

• para al menos un argumento, la conversión de de EX a PX es mejor que la conversión de EX a QX.

Lectura en:

• Si existe una conversión implícita de T1 a T2 , y no hay conversión implícita de T2 a T1 existe, C1 es la mejor conversión.

Como no hay una conversión implícita de cualquier clase derivada a su base, pero no viceversa, las reglas anteriores significan que cualquier sobrecarga de emparejamientos de clase dervied siempre supera a un parámetro de la clase base en una sobrecarga.

+0

¿Alguna referencia a la fuente? –

Cuestiones relacionadas