我构建了一个使用 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//在老板电脑上给出异常,在我的电脑上工作
但是请看以下内容:
(((IDictionary)expando).ContainsKey("Attention"))
true // Returns "True" on boss computer and on my computer, WTF!
所以我尝试以下操作:
(NotifyEnums)(((IDictionary)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;
}
}
Và
public void OnNext(ExpandoObject value)
{
dynamic expando = value;
if ((NotifyEnums)(((IDictionary)expando)["Attention"]) == NotifyEnums.ALERT)
// WORKS on BOSS PC (wtf?) and works on my pc.
{
_needsAttention = true;
}
}
这是怎么回事,谁能详细说说?
biên tập:
但是还有一点,Program Crahses之后,我点击Continue,又报错,再次点击continue,然后程序继续运行,就好像什么都没发生一样。它从动态对象中读取正确的值。
看起来您在 boss 机器上打开了第一次机会异常。在 Debug/Exceptions 下查看并取消选中 Thrown 列中的所有内容。当类没有直接实现成员时,expando 对象抛出异常是正常的,它使用异常来触发二次查找并返回正确的信息。
Tôi là một lập trình viên xuất sắc, rất giỏi!