2

这个问题与这个问题基本相同,尽管那个人的问题的答案原来是一个简单的尾随空格。

我的问题是我正在从 Web API 作为字典检索数据,然后尝试从中获取值。我正在使用TryGetValue,因为并非字典中的每个项目都必然包含每个键。出于某种原因,虽然我可以在一个键存在时毫无问题地获得它的值,但另一个键TryGetValue总是评估为假,因此不会返回该值,即使我可以在调试中看到该键存在.

因此,此块始终检索“System.Description”键的值(如果存在):

string descriptionValue = "";
if (workItem.Fields.TryGetValue("System.Description", out descriptionValue))
{
    feature.Description = descriptionValue;
}

但是,这个几乎相同的块永远不会检索“CustomScrum.RoadmapGroup”键的值:

int RoadmapGroupValue = 0;
if (workItem.Fields.TryGetValue("CustomScrum.RoadmapGroup", out RoadmapGroupValue))
{
    feature.RoadmapGroup = RoadmapGroupValue;
}

正如您在此屏幕截图中看到的那样,字典确实包含一个名称与我的TryGetValue语句完全匹配的键: 在此处输入图像描述

如果我在TryGetValue语句评估为 true ( feature.Description = descriptionValue;) 时应该运行的代码上设置断点,则它永远不会被命中。

对于字典中的每个项目,该feature.RoadmapGroup变量都设置为 0。

至少在过去的两个小时里,我一直盯着这个,我看不出我做错了什么。

4

2 回答 2

3

这是你的演员出错的场景。

private void foo()
{
    Dictionary<string, object> dict = new Dictionary<string, object>();
    object obj = new object();
    obj = "1";
    dict.Add("CustomScrum.RoadmapGroup", obj);
    object val;
    var result = dict.TryGetValue("CustomScrum.RoadmapGroup", out val);
    int value = (int)val;
}

TryGetValue()返回true,但最后一行(演员表), throws System.InvalidCastException: 'Specified cast is not valid.',虽然如果你使用断点来查看字典内容,看起来你有一些可以转换为int. 见下文:

在此处输入图像描述

所以我相信当你将值添加到字典中时,你并没有真正添加一个,int而是看起来像一个int.

编辑

我只是替换int value = (int)val;int value = Convert.ToInt32(val);which 转换值就好了。所以你可能想尝试使用它,看看它是否也有效。

于 2017-09-22T17:45:50.990 回答
0

你确定这个“CustomScrum.RoadmapGroup”键是一个字符串吗?如果是,请确保它不包含任何特殊的不可读字符。您可以在调试时复制此值,将其放入Watch窗口并检查长度/字节表示,然后对具有相同内容的手写字符串执行相同操作。

于 2017-09-22T17:02:04.473 回答