【问题标题】:I get an error while trying to assign Dictionary<string, object> to a string variable尝试将 Dictionary<string, object> 分配给字符串变量时出现错误
【发布时间】:2016-02-23 03:00:31
【问题描述】:
    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();
        }
    }

我收到此错误:

无法将类型“object”隐式转换为“string”。显式 存在转换(您是否缺少演员表?)

【问题讨论】:

  • 您正在定义一个字典,其中键是字符串,值是对象(因此,Dictionary&lt;string, object&gt; 为什么您希望隐式转换 string mystr = val.Value; 会起作用?
  • 使用Dictionary&lt;&gt; 的美妙之处在于,您可以直接询问相关值,而不是遍历键来查找您想要的内容。 myVal["key1"] 如果您确定密钥存在,或者myVal.TryGetValue("key1", out myStr) 如果您不存在。
  • 您应该学习阅读错误消息并立即知道该怎么做,例如..如果没有正确转换或将其转换为字符串,您将无法将整数存储为字符串..在您的如果没有正确的转换,字典 永远不会适合外行人的字符串。
  • 使用var mystr = val.Value; 隐式输入将解决这个确切代码的直接问题,只是因为Console.Write() 将在您的对象上使用.ToString(),但其他使用Dictionary&lt;string, string&gt; 的建议会很远如果您确定您的值是字符串,那就更好了。使用强制转换作为类型安全的解决方法会让你遇到这些问题。
  • 在这里,为了更好地理解,我对其进行了简化,我的对象部分因类型而异。

标签: c# asp.net .net c#-4.0 c#-3.0


【解决方案1】:

为什么会出现这样的错误:

在使用foreach (var val in myVal) 迭代集合(Dictionary&lt;string, object&gt;)时,每个val 将是KeyValuePair&lt;string, object&gt;,其中val.Key 表示键,val.Value 表示与键对应的值。

在您的情况下,该值将是 object 类型,因为您的集合是 &lt;string, object&gt; 类型。通过使用string mystr = val.Value;,您将一个对象分配给一个字符串变量。根据规则,这个分配是不允许的。

解决方案:

  • 将对象转换为如下字符串:

    string mystr = (string)(val.Value);
    
  • 填充Dictionary 的语句myVal.Add("key2", "value2"); 表示键和值都是字符串类型,因此您可以将字典重新定义为

    Dictionary<string, string> myVal = new Dictionary<string, string>();
    

【讨论】:

  • 谢谢,由于某种原因,CASTING 在我的实际项目中对我不起作用,但它在控制台应用程序中起作用。无论如何,让我明天再试一次。我无法实现 Dictionary 因为我的数据因类型而异。
  • @MohammadFawadSurosh:嗯...!你可以试一试。它会工作
【解决方案2】:

两个选择:

要么使用Dictionary&lt;string, string&gt;

将从Dictionary&lt;string, object&gt; 中获得的object 实例转换为string

string mystr = (string)(val.Value);

【讨论】:

    【解决方案3】:

    我的错,我发现有嵌套字典,其中另一个 List 操作导致问题。我刚刚添加了一些 foreach 循环以进入最终字典并深入研究完美运行的列表。

    我的最后一张如下图:

    Messages.Add(Path.GetFileName(fileName), ((List<string>)(runResult.Single(m => m.Key == "Messages")).Value)[0]);
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      相关资源
      最近更新 更多