2010-07-10 13 views

Respuesta

16

var es sólo una abreviatura de "dejar que el compilador elija el tipo de variable correcto para mí" (la inferencia de tipo en tiempo de compilación es el término más exacto).

object, por otro lado, es un tipo específico; todos los otros tipos de referencia derivan de object, por lo que puede asignar cualquier cosa a una variable del tipo object.

+3

A menos que sea una primitiva, en cuyo caso debe estar en la caja antes de ser asignada en el 'Referencia de objeto'. –

+0

Creo que algo que debería agregarse a la respuesta seleccionada es que si usa var, como dijo @Ben Voigt, puede hacer cosas al objeto almacenado en var sin tener que emitirlo. – Eric

10

var es la respuesta cuando usted se encuentra preguntando, es lo que realmente tiene que escribir el nombre del tipo que siempre dos veces, en ej .:

Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>> myDict = new Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>(); 

¿Por qué no es amigo, no lo hace. Utilice var lugar:

var myDict = new Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>(); 

ahora myDict realmente es una Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>, lo que puede añadir cosas a la misma, que enumerar, etc.

Si lo declaró como object no se podía hacer ninguna operación con él proporcionados por Dictionary, solo los válidos para todos los objetos.

+2

Me encantaría ver ese código en acción. –

+0

¿Su computadora con Windows? j/k. Inventé ese tipo en particular, pero estaba tratando de usar tipos que realmente podrían combinarse entre sí. –

+0

@Joe, yo no ... – jonnystoten

4
var foo = "Hello, I am a string!"; 
// foo is a string, so this compiles 
var fooCharArray = foo.ToCharArray(); 

object bar = foo; 
// bar is not a string, so this does not compile 
var barCharArray = bar.ToCharArray(); 

En el primer ejemplo, el compilador sabe que foo es una cadena y por lo que podemos llamar a métodos de las cadenas de foo.

En el segundo ejemplo, "upcast" la cadena foo a un objeto. Ahora el compilador no sabe (porque no debería saber) que bar es en realidad una cadena, y no podemos llamar a los métodos de cadena en bar. El compilador no permitirá downcasting implícito de un objeto (o cualquier tipo de base) a un tipo derivado (como System.String). Es parte de las reglas de seguridad del tipo de tiempo de compilación.

5

var todavía está fuertemente tipado pero con el objeto tendrás que echar todo.