我已經構建了一個使用Dynamic關鍵字的程序。動態對象在一臺PC上工作,但不在另一臺上
在我的代碼點我這樣做:
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;
}
}
那麼這是怎麼回事,任何人都可以詳細說明?
編輯:
但還有一件事爲好,該方案Crahses後,我點擊繼續,再次得到錯誤,再次點擊繼續,然後程序繼續若無其事。它從動態對象中讀取正確的值。
如果你在老闆的PC上運行它,而不是在調試器中,會發生什麼? –
@JonSkeet 週末結束後我會試試:P – ProgrammerAtWork
@JonSkeet調試器或者沒有調試器,沒關係。老闆仍然有錯誤。我把我的二進制文件發給了我的老闆PC,他們工作的很好。所以這是在二進制文件中的東西。在VS2010中,取消選中「Debug - > Exceptions」下的CLR異常,可以在Boss PC上停止這種異常。但檢查CLR異常不會導致這種異常發生在我的電腦上。 – ProgrammerAtWork