Dictionary<string, object> myVal = new Dictionary<string, object>();
    myVal.Add("key1", "value1");
    myVal.Add("key2", "value2");
    foreach (var val in myVal)
    {
        if (val.Key == "key1")
        {
            string mystr = val.Value;
            Console.Write(val.Value);
            Console.ReadLine();
        }
    }

Я получаю эту ошибку:

Невозможно неявно преобразовать тип «объект» в «строку». Существует явное преобразование (вам не хватает приведения?)

1
M. Fawad Surosh 23 Фев 2016 в 06:00

3 ответа

Лучший ответ

Почему возникает такая ошибка:

При итерации Коллекции (Dictionary<string, object>) с использованием foreach (var val in myVal) каждый val будет KeyValuePair<string, object>, где val.Key обозначает Ключ, а val.Value обозначает значение, соответствующее к ключу.

В вашем случае значение будет иметь тип object, поскольку ваша коллекция имеет тип <string, object>. А с помощью string mystr = val.Value; вы присваиваете объект строковой переменной. согласно правилам это назначение не разрешено.

Решение:

  • Приведите объект к строке, как показано ниже:

    string mystr = (string)(val.Value);
    
  • Оператор myVal.Add("key2", "value2");, который заполняет Dictionary, указывает, что и ключ, и значение относятся к строковому типу, поэтому вы можете переопределить словарь как

    Dictionary<string, string> myVal = new Dictionary<string, string>();
    
3
sujith karivelil 23 Фев 2016 в 03:13

Моя проблема, я обнаружил, что есть вложенные словари, внутри которых работает другой список, который вызвал проблему. Я просто добавил цикл foreach, чтобы добраться до последнего словаря и изучить список, который отлично работал.

Моя последняя работа выглядит так:

Messages.Add(Path.GetFileName(fileName), ((List<string>)(runResult.Single(m => m.Key == "Messages")).Value)[0]);
0
M. Fawad Surosh 23 Фев 2016 в 21:09

Два варианта:

Либо используйте Dictionary<string, string>

Или

Преобразуйте экземпляры object, которые вы получили из Dictionary<string, object>, в string

string mystr = (string)(val.Value);
3
spender 23 Фев 2016 в 03:03