Обычный бросок, приведение к двойному типу int невозможно - PullRequest
0 голосов
/ 16 октября 2018

У меня есть словарь, в котором хранятся различные типы переменных (string, double, int и т. Д.), Они хранятся как объекты.

У меня есть универсальный метод Set и универсальный метод get.

private static Dictionary<int, object> dict = new Dictionary<int, object>();

public static void Set<T>(int key, object value)
{
    dict.Add(key, (T)value);
}

public static T Get<T>(int key)
{
    dict.TryGetValue(key, out object value);
    return (T)value;
}

static void Main(string[] args)
{
    Set<int>(1, 100);
    Get<double>(1);
}

В Main я пытаюсь сохранить переменную 100 как целое число, которое работает, оно сохраняется «как объект» в словаре.Теперь при попытке получить переменную, приведя ее к удвоению, генерируется исключение IllegalCastException, но почему?Доступно явное приведение от объекта к двойному, а также явное приведение от int к двойному.

1 Ответ

0 голосов
/ 16 октября 2018

Вы не разыгрываете от object до int или double.Вы распаковываете .И правила распаковки ясны - вы можете вынимать только тот же тип, что и вставленный. (Вставьте несколько предостережений вокруг перечислений и базовых типов, которые не совсем соответствуют рассматриваемому вопросу)

Чтобы распаковка типов значений прошла успешно во время выполнения, распаковываемый элемент должен быть ссылкой на объект, который был ранее создан путем создания бокса экземпляра этого типа значения.Попытка распаковать null вызывает NullReferenceException.Попытка распаковать ссылку на несовместимый тип значения приводит к InvalidCastException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...