¿Cómo declarar un objeto de diccionario estático dentro de una clase estática? Lo intenté
public static class ErrorCode
{
public const IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>()
{
{ "1", "User name or password problem" }
};
}
Pero el compilador se queja de que " un campo constante de un tipo de referencia que no sea cadena solo se puede inicializar con nulo ".
c#
.net
dictionary
Graviton
fuente
fuente
Respuestas:
Si desea declarar el diccionario una vez y nunca cambiarlo, declare como de solo lectura:
Si desea que los elementos del diccionario sean de solo lectura (no solo la referencia, sino también los elementos de la colección), tendrá que crear una clase de diccionario de solo lectura que implemente IDictionary.
Consulte ReadOnlyCollection como referencia.
BTW const solo se puede usar al declarar valores escalares en línea.
fuente
ReadOnlyDictionary
. Una opción más eficiente (pero menos segura) es asignarlo a unIReadOnlyDictionary
tipo.La sintaxis correcta (probada en VS 2008 SP1) es la siguiente:
fuente
Antigua pregunta, pero me pareció útil. Resulta que también hay una clase especializada para un diccionario que usa una cadena tanto para la clave como para el valor:
Editar: según el comentario de Chris a continuación, generalmente se prefiere usar
Dictionary<string, string>
over,StringDictionary
pero dependerá de su situación. Si está tratando con una base de código más antigua, es posible que esté limitado aStringDictionary
. Además, tenga en cuenta que la siguiente línea:devolverá nulo si
myDict
es aStringDictionary
, pero se lanzará una excepción en caso deDictionary<string, string>
. Consulte la publicación SO que mencionó para obtener más información, que es la fuente de esta edición.fuente
StringDictionary
lugar deDictionary<string, string>
?El problema con su ejemplo inicial se debió principalmente al uso de en
const
lugar destatic
; no puede crear una referencia constante no nula en C #.Creo que esto también habría funcionado:
Además, como señala Y Low, agregar también
readonly
es una buena idea, y ninguno de los modificadores discutidos aquí evitará que el diccionario en sí sea modificado.fuente
fuente
Convierta el diccionario en estático y nunca lo agregue fuera del ctor de su objeto estático. Esa parece ser una solución más simple que jugar con las reglas estáticas / const en C #.
fuente
De acuerdo, estoy trabajando en ASP 2.x (no es mi elección ... pero ¿quién se queja?).
Ninguno de los ejemplos de inicialización del diccionario funcionaría. Entonces me encontré con esto: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx
... lo que me hizo pensar en el hecho de que no se puede usar la inicialización de colecciones en ASP 2.x.
fuente
Puede usar el constructor estático / class para inicializar su diccionario:
fuente
Probablemente se inicialice en el constructor.
fuente