2010-12-17 18 views

Respuesta

25

Debido diccionarios genéricos podrían contener instancias de un tipo de valor, y nulo no es válido para un tipo de valor. Por ejemplo:

var dict = new Dictionary<string, DateTime>(); 
DateTime date = dict["foo"]; // What should happen here? date cannot be null! 

En su lugar, debe utilizar el método TryGetValue del diccionario:

var dict = new Dictionary<string, DateTime>(); 
DateTime date; 

if (dict.TryGetValue("foo", out date)) { 
    // Key was present; date is set to the value in the dictionary. 
} else { 
    // Key was not present; date is set to its default value. 
} 

Además, un diccionario que almacena los tipos de referencia seguirá siendo almacenar valores nulos. Y su código podría considerar que "el valor es nulo" para ser diferente de "la clave no existe".

+0

Esto no se refiere realmente la razón de la decisión de diseño; simplemente podrían haber hecho que devuelva 'default (DateTime)' en lugar de null. – Extragorey

+0

@Extragorey Sí lo hace, en particular, la última frase: sea cual sea el valor "no encontrado", es posible que deba almacenar ese valor como significativo. Si recuperar una clave que no se encuentra devuelve 'default (DateTime)', entonces no puede distinguir entre "value is' default (DateTime) '" y "key no está presente," al menos sin una llamada adicional a ' ContainsKey() '(que duplicaría innecesariamente el costo de la operación). Para un diccionario que contiene un tipo de referencia como el valor, tal vez 'null' es un estado significativo aparte de" la clave no está presente ". – cdhowie

+0

Gracias, esa explicación tiene más sentido. – Extragorey

3

Microsoft decidió que =)
Haga una comprobación en línea para evitar eso.

object myvalue = dict.ContainsKey(mykey) ? dict[mykey] : null; 
3

Razón práctica: porque un diccionario podría almacenar un valor nulo. No podría diferenciar este caso con una excepción en su escenario.

Cuestiones relacionadas