我已经构建了一个使用 Dynamic 关键字的程序。
在我的代码中,我这样做:
public void OnNext(ExpandoObject value)
{
dynamic expando = value;
if (expando.Attention == NotifyEnums.ALERT)
{
_needsAttention = true;
}
}
这行得通,所以我将它提交给 SourceControl。然后我的老板得到文件,尝试运行它但在线出错if (expando.Attention == NotifyEnums.ALERT)
,显然是expando.Attention在动态对象中不存在:
这让我很困惑,因为我们都针对相同的 .NET 版本:.NET Framework 4 Platform Update 1 KB2478063
而且我知道该值是在代码中设置的。
所以我在读取动态值之前设置了一个断点,并打开了即时窗口。
expando.Attention // Gives an exception on boss computer, works on my computer
但请看以下内容:
(((IDictionary<String, object>)expando).ContainsKey("Attention"))
true // Returns "True" on boss computer and on my computer, WTF!
所以我尝试以下方法:
(NotifyEnums)(((IDictionary<String, Object>)expando)["Attention"])
ALERT // Returns alert on boss computer
所以总结一下:
public void OnNext(ExpandoObject value)
{
dynamic expando = value;
if (expando.Attention == NotifyEnums.ALERT)
// CRASHES on boss pc, works on my pc
// Error says Attention does not exist.
{
_needsAttention = true;
}
}
和
public void OnNext(ExpandoObject value)
{
dynamic expando = value;
if ((NotifyEnums)(((IDictionary<String, Object>)expando)["Attention"]) == NotifyEnums.ALERT)
// WORKS on BOSS PC (wtf?) and works on my pc.
{
_needsAttention = true;
}
}
那么这是怎么回事,谁能详细说明?
编辑:
但是还有另一件事,在程序崩溃之后,我单击继续,再次出现错误,再次单击继续,然后程序继续运行,就好像什么也没发生一样。它从动态对象中读取正确的值。