2012-08-15 8 views
6

¿Cómo puede saber la variable de tipo implícita var un tipo que no está definido en el alcance (utilizando using)?¿Cómo puede saber var de un tipo indefinido?

Ejemplo:

Esto está bien

public class MyClass 
{ 
    public void MyMethod   
    { 
     var list = AStaticClass.GetList(); 
    } 
} 

Pero esto no es aceptable

public class MyClass 
{ 
    public void MyMethod   
    { 
     List<string> list = AStaticClass.GetList(); 
    } 
} 

En el último fragmento de código que tengo que añadir using System.Collections.Generic; para que funcione.

¿Cómo funciona esto?

+1

¿Qué es "no está bien"? ¿Qué * exactamente * significa? – Tigran

+1

No compila, el compilador dirá un tipo desconocido 'List ' (o algo así). –

Respuesta

11

¿Cómo funciona?

Cuando el compilador hace la inferencia de tipos que sustituye var con System.Collections.Generic.List<string> y su código se convierte en:

public class MyClass 
{ 
    public void MyMethod   
    { 
     System.Collections.Generic.List<string> list = AStaticClass.GetList(); 
    } 
} 

Pero ya que el compilador escupe IL, el siguiente programa C# (sin using declaraciones):

public class Program 
{ 
    static void Main() 
    { 
     var result = GetList(); 
    } 

    static System.Collections.Generic.List<string> GetList() 
    { 
     return new System.Collections.Generic.List<string>(); 
    } 
} 

y la Main método es el siguiente:

.method private hidebysig static void Main() cil managed 
{ 
    .entrypoint 
    .maxstack 8 
    L_0000: call class [mscorlib]System.Collections.Generic.List`1<string> Program::GetList() 
    L_0005: pop 
    L_0006: ret 
} 

Como puede ver, el compilador dedujo el tipo del lado derecho del operador de asignación y reemplazó var con el nombre de tipo completo.

3

El compilador realmente conoce el tipo. Aunque no lo acortó con el uso del compilador aún puede reemplazar 'var' con la definición de tipo completo con espacios de nombres System.Collections.Generic.List<string> ... de la misma manera que podría definir su variable con esa línea sin la directiva 'using'.

Cuestiones relacionadas