Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态对象在一台电脑上工作,但在另一台电脑上不工作_C#_.net_Dynamic - Fatal编程技术网

C# 动态对象在一台电脑上工作,但在另一台电脑上不工作

C# 动态对象在一台电脑上工作,但在另一台电脑上不工作,c#,.net,dynamic,C#,.net,Dynamic,我已经构建了一个使用Dynamic关键字的程序 在我的代码中,我会这样做: public void OnNext(ExpandoObject value) { dynamic expando = value; if (expando.Attention == NotifyEnums.ALERT) { _needsAttention = true; } } 这是可行的,所以我把它提交给SourceControl。然后,我的上司获取文件,尝试运行它,

我已经构建了一个使用Dynamic关键字的程序

在我的代码中,我会这样做:

public void OnNext(ExpandoObject value)
{
    dynamic expando = value;
    if (expando.Attention == NotifyEnums.ALERT)
    {
        _needsAttention = true;
    }
}
这是可行的,所以我把它提交给SourceControl。然后,我的上司获取文件,尝试运行它,但在第
行中出现错误,如果(expando.Attention==NotifyEnums.ALERT)
,显然expando.Attention不存在于动态对象中:

这让我非常困惑,因为我们都以相同的.NET版本为目标:
.NET Framework 4 Platform Update 1 KB2478063
,我知道该值是在代码中设置的

因此,我在读取动态值之前设置了一个断点,并打开即时窗口

expando.Attention//在boss计算机上出现异常,在我的计算机上工作

但请看以下几点:

(((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(expandooobject值)
{
动态expando=数值;
如果((NotifyEnums)((IDictionary)expando)[“注意])==NotifyEnums.ALERT)
//在BOSS PC(wtf?)和我的PC上工作。
{
_needsatension=真;
}
}
那么到底发生了什么,有人能详细说明一下吗

编辑:


但还有另一件事,在程序崩溃后,我单击“继续”,再次获取错误,再次单击“继续”,然后程序继续运行,就像什么也没发生一样。它从动态对象中读取正确的值。

看起来您在boss机器上打开了第一次机会异常。查看Debug/Exceptions下,取消选中抛出列中的所有内容。
expando对象在类未直接实现成员时抛出异常是正常的,它使用异常触发二次查找并返回正确的信息。

看起来您在boss计算机上首次打开了异常。查看Debug/Exceptions下,取消选中抛出列中的所有内容。
expando对象在类没有直接实现成员时抛出异常是正常的,它使用异常触发二次查找并返回正确的信息。

我的老板不在,所以我会尝试一下你的建议。你说的有道理,但是如果我检查抛出列中的所有内容(在我的电脑上)并运行程序,我就不会在读取expando对象时遇到异常。知道为什么吗?不知道。Options/Debugging/General中有一个名为“仅启用我的代码”的选项。设置后,另一列显示在调试/异常中,称为“用户未处理”。也许本专栏可能会影响您是否捕获这些异常。@JoelLucsy是对的。转到“异常”对话框并单击“全部重置”。好的,我的老板终于有时间陪我了。是的,就是这样,取消选中抛出列stops中的CLR异常可以防止异常。但是在我的电脑上检查抛出的列不会导致异常:S.我的老板不在这里,所以我会尝试一下你的建议。你说的有道理,但是如果我检查抛出列中的所有内容(在我的电脑上)并运行程序,我就不会在读取expando对象时遇到异常。知道为什么吗?不知道。Options/Debugging/General中有一个名为“仅启用我的代码”的选项。设置后,另一列显示在调试/异常中,称为“用户未处理”。也许本专栏可能会影响您是否捕获这些异常。@JoelLucsy是对的。转到“异常”对话框并单击“全部重置”。好的,我的老板终于有时间陪我了。是的,就是这样,取消选中抛出列stops中的CLR异常可以防止异常。但是在我的电脑上检查抛出的列不会导致异常:S.如果你在你老板的电脑上运行它而不是在调试器中,会发生什么情况?@JonSkeet我会在周末结束后再试:P@JonSkeet调试器或无调试器,都无所谓。老板还是会犯错。我把我的二进制文件发送到我老板的电脑上,它们工作得很好。所以它是二进制文件中的一些东西。在VS2010中取消选中
Debug->exceptions
下的
CLR exceptions
将在Boss PC上停止此异常。但检查CLR exceptions不会导致此异常在我的PC上发生。如果在PC上运行Boss的二进制文件,是否会收到相同的错误?debug->Exceptions周围的调试选项不应对二进制文件产生任何影响…如果在老板的PC上而不是在调试器中运行,会发生什么情况?@JonSkeet周末结束后我会尝试:P@JonSkeet调试器或无调试器,都无所谓。老板还是会犯错。我把我的二进制文件发送到我老板的电脑上,它们工作得很好。所以它是二进制文件中的一些东西。在VS2010中取消选中
Debug->exceptions
下的
CLR exceptions
将在Boss PC上停止此异常。但检查CLR exceptions不会导致此异常在我的PC上发生。如果在PC上运行Boss的二进制文件,是否会收到相同的错误?关于debug->Exceptions的调试选项不应该对二进制文件有任何影响。。。
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;
    }
}