Как объявить объект статического словаря внутри статического класса? Я старался
public static class ErrorCode
{
public const IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>()
{
{ "1", "User name or password problem" }
};
}
Но компилятор жалуется, что « константное поле ссылочного типа, отличного от строки, может быть инициализировано только нулевым значением ».
c#
.net
dictionary
Гравитон
источник
источник
Ответы:
Если вы хотите объявить словарь один раз и никогда не менять его, объявите его как readonly:
private static readonly Dictionary<string, string> ErrorCodes = new Dictionary<string, string> { { "1", "Error One" }, { "2", "Error Two" } };
Если вы хотите, чтобы элементы словаря были доступны только для чтения (не только для ссылки, но и для элементов в коллекции), вам необходимо создать класс словаря только для чтения, который реализует IDictionary.
Ознакомьтесь с ReadOnlyCollection для справки.
BTW const можно использовать только при объявлении скалярных значений встроенными.
источник
ReadOnlyDictionary
. Более эффективный (но менее безопасный вариант) - назначить егоIReadOnlyDictionary
типу.Правильный синтаксис (проверенный в VS 2008 SP1) таков:
public static class ErrorCode { public static IDictionary<string, string> ErrorCodeDic; static ErrorCode() { ErrorCodeDic = new Dictionary<string, string>() { {"1", "User name or password problem"} }; } }
источник
Старый вопрос, но я нашел это полезным. Оказывается, есть также специализированный класс для словаря, использующий строку как для ключа, так и для значения:
private static readonly StringDictionary SegmentSyntaxErrorCodes = new StringDictionary { { "1", "Unrecognized segment ID" }, { "2", "Unexpected segment" } };
Изменить: Согласно приведенному ниже комментарию Криса, использование
Dictionary<string, string>
overStringDictionary
обычно предпочтительно, но будет зависеть от вашей ситуации. Если вы имеете дело со старой базой кода, вы можете ограничиться расширениемStringDictionary
. Также обратите внимание, что следующая строка:myDict["foo"]
вернет null, если
myDict
это aStringDictionary
, но в случаеDictionary<string, string>
. См. Сообщение SO, которое он упомянул, для получения дополнительной информации, которая является источником этого редактирования.источник
StringDictionary
вместоDictionary<string, string>
?enum Commands { StudentDetail } public static class Quires { public static Dictionary<Commands, String> quire = new Dictionary<Commands, String>(); static Quires() { quire.add(Commands.StudentDetail,@"SELECT * FROM student_b"); } }
источник
Проблема с вашим первоначальным примером была связана, прежде всего, с использованием,
const
а неstatic
; вы не можете создать ненулевую ссылку на константу в C #.Я считаю, что это тоже сработало бы:
public static class ErrorCode { public static IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>() { {"1", "User name or password problem"} }; }
Кроме того, как указывает Y Low, добавление также
readonly
является хорошей идеей, и ни один из обсуждаемых здесь модификаторов не предотвратит изменение самого словаря.источник
Вы можете использовать конструктор static / class для инициализации вашего словаря:
public static class ErrorCode { public const IDictionary<string, string> ErrorCodeDic; public static ErrorCode() { ErrorCodeDic = new Dictionary<string, string>() { {"1", "User name or password problem"} }; } }
источник
Сделайте словарь статическим и никогда не добавляйте в него за пределами ctor вашего статического объекта. Это кажется более простым решением, чем возиться со статическими / константными правилами в C #.
источник
ОК - значит, я работаю в ASP 2.x (не мой выбор ... но эй, кто скулит?).
Ни один из примеров инициализации словаря не будет работать. Потом я наткнулся на это: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing- dictionaries-and-collections.aspx
... что убедило меня в том, что нельзя использовать инициализацию коллекций в ASP 2.x.
источник
public static class ErrorCode { public const IDictionary<string , string > m_ErrorCodeDic; public static ErrorCode() { m_ErrorCodeDic = new Dictionary<string, string>() { {"1","User name or password problem"} }; } }
Вероятно, инициализируйте в конструкторе.
источник