这个问题与this one基本相同,尽管这个人问题的答案结果是一个简单的尾随空间。
我的问题是我从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.
我至少在过去的两个小时里一直盯着这个,我无法看清我做错了什么。
答案 0 :(得分:1)
这是你的演员出错的场景。
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
,但最后一行(强制转换)抛出System.InvalidCastException: 'Specified cast is not valid.'
,但如果您使用断点查看看起来的字典内容你有一些东西可以转换为int
。见下文:
因此,我相信当您将值添加到字典中时,您并未真正添加int
,而是看起来像int
。
修改强>
我刚刚将int value = (int)val;
替换为int value = Convert.ToInt32(val);
,它可以很好地转换价值。所以你可能想尝试使用它,看看它是否也能正常工作。
答案 1 :(得分:0)
您确定此“CustomScrum.RoadmapGroup”键是字符串吗?如果是,请确保它不包含任何特殊的不可读字符。您可以在调试时复制此值,将其放入 Watch 窗口并检查长度/字节表示,然后对具有相同内容的手写字符串执行相同操作。