即使存在密钥,TryGetValue 也会评估为 False

TryGetValue Evaluating to False Even When Key is Present

这个问题和基本一样,虽然那个人问题的答案竟然是一个简单的尾随space.

我的问题是我正在从网络 API 中检索数据作为字典,然后尝试从中获取值。我正在使用 TryGetValue 因为不是字典中的每个项目都必须包含每个键。出于某种原因,虽然我可以毫无问题地获得一个键的值,但另一个键 TryGetValue 的计算结果总是为 false,因此 return 没有值,即使我可以在调试中看到密钥存在。

因此,此块始终检索“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 语句的计算结果为真 (feature.Description = descriptionValue;),它应该是 运行,它永远不会被命中。

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

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

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

这是一个你的转换出错的场景。

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() returns true,但最后一行(强制转换)抛出 System.InvalidCastException: 'Specified cast is not valid.',尽管如果你使用断点来查看字典内容它 看起来像 你有一些东西可以转换成int。见下文:

所以我相信,当您将值添加到字典时,您实际上并不是在添加 int,而是看起来像 int.

的东西

编辑

我刚刚将 int value = (int)val; 替换为 int value = Convert.ToInt32(val);,这样就可以很好地转换值。所以你可能想尝试使用它,看看它是否也有效。