Dynamicキーワードを使用するプログラムを作成しました。
私のコードのある時点で、私はこれを行います:
public void OnNext(ExpandoObject value)
{
dynamic expando = value;
if (expando.Attention == NotifyEnums.ALERT)
{
_needsAttention = true;
}
}
そしてこれは機能するので、SourceControlに送信します。次に、上司がファイルを取得して実行しようとしますが、行上でエラーが発生しますif (expando.Attention == NotifyEnums.ALERT)
。明らかにexpandoです。動的オブジェクトに注意が存在しません。
どちらも同じ.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;
}
}
では、何が起こっているのでしょうか。
編集:
しかし、別のこともあります。ProgramCrahsesの後、[Continue]をクリックし、エラーを再度取得し、[Continue]をもう一度クリックすると、何も起こらなかったかのようにプログラムが続行されます。動的オブジェクトから正しい値を読み取ります。