2012-01-17 11 views
18

Tengo una consulta sobre el tipo de nulo.
Tengo un pequeño programa ¿alguien me puede decir acerca de esto.Tipo de literal nulo en C#

public class TestApplication 
{ 
    public void ShowText(object ob) 
    { 
     Console.Write("Inside object"); 
    } 
    public void ShowText(string str) 
    { 
     Console.Write("Inside string"); 
    } 
    public void ShowText(int i) 
    { 
     Console.Write("Inside int."); 
    } 
    public void ShowText(char c) 
    { 
     Console.Write("Inside Character"); 
    } 
    static void Main(string[] args) 
    { 
     new TestApplication().ShowText(null);    
     Console.Read(); 
    } 
} 

Por qué llama a la función de cadena.
Significa que el tipo de nulo es cadena.
Podría parecer una conclusión estúpida, pero no puedo encontrar la región por la que llama a la función de cadena.

Respuesta

31

Tu pregunta sobre el tipo de la nula literal es respondida aquí: What is the type of null literal?

Pero eso no importa realmente cuando se habla de resolución de sobrecarga. El valor nulo real en sí mismo se convertirá automáticamente al tipo al que termine.

En cuanto a la razón por la sobrecarga de string se llama:

  1. no se puede pasar null como int y char parámetros como son los tipos de valor, por lo que esas dos sobrecargas está fuera. (Podrían haber sido candidatos tenían los hiciste anulable int? y char? tipos, pero no voy a entrar en eso.)

  2. Entre los otros dos sobrecargas que toman los tipos de referencia, string es un tipo más específico que object. Es decir, deriva de (y por lo tanto es implícitamente convertible a) object. Además, a partir de la siguiente sección en la especificación del lenguaje C# (énfasis mío):

    7.5.3.5 Better objetivo de conversión

    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 T1-T2 existe, y no existe una conversión implícita de T2 a T1

    • ...

Por lo tanto, la sobrecarga de string es elegido como el mejor ajuste.

+0

¿Puede darle a mi región por qué es más específico? No soy capaz de entender ¿Significa que el tipo de nulo es cadena? –

+0

@krshekhar: no, tiene algún tipo. Para forzar el objeto do: '(object) null' – leppie

+2

De la respuesta vinculada, de C# 3.0 en el' null type' se elimina de la especificación, por lo que null básicamente no tiene ningún tipo. – SWeko

1

Este es un ejemplo de la resolución de sobrecarga en C#, no prueba que el tipo de null sea una cadena.

null es un valor especial que se incluye en el dominio de cualquier tipo de referencia, básicamente determina que no hay una referencia válida. Como tal, puede ser un string, un int?, un object etc., etc.

Puede incluso emitir null a cualquier tipo de referencia, para obtener un null "correctamente", p. Ej. debe convertir nula si se usa como un valor en un operador de

int? value = (i > 0) ? i : null; // does not compile 
int? value = (i > 0) ? i : (int?)null; //works 
4

null? puede caber a cualquier tipo de referencia. y por lo tanto es un muy buen ejemplo para el polimorfismo.

digamos que tiene una clase Vehicle. creas tres clases más Two-Wheeler, Three-Wheeler, Four-Wheeler.

si este último 3 clase extendsVehicle clase; se llama Vehicle se especifica en esas tres categorías.

Por lo tanto, dado un valor, por ejemplo, coche, ajuste más específico a este valor es Four-Wheeler.

Similar es el caso con null. puede caber a Object O String; pero una coincidencia más específica es String.

vamos a ver cómo piensa compilador (específica de su código sólo) cuando ve una llamada al método ShowText(null)

  1. Encuentra ShowText método.
  2. ¡Oh, he encontrado 4, métodos, a cuál llamar? !!
  3. Veamos qué argumento se pasa, hmm .. es null.
  4. Encuentra el método ShowText que tiene el tipo de referencia como argumento. todas las sobrecargas con argumentos primitivos son ignoradas.
  5. Oh No ... puedo hacer coincidir con eithe string O object.
  6. Cuál es más específico. es decir, lo que viene primero en la jerarquía de herencia desde abajo.
  7. Hurra ... lo encontré .. es string .. vamos a llamarlo.

Y, para un ejercicio si quiere entender eso, lo que sucederá si el compilador encuentra en el paso 6 más de una coincidencia ... defina ShowText (string [] vals) y mírese.

Cuestiones relacionadas