Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.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# as运算符拒绝该对象,即使该对象在调试器中的类型正确_C#_.net_Casting - Fatal编程技术网

C# as运算符拒绝该对象,即使该对象在调试器中的类型正确

C# as运算符拒绝该对象,即使该对象在调试器中的类型正确,c#,.net,casting,C#,.net,Casting,下面的代码引发一个异常。如果没有简单的答案或要检查的东西,我会尝试生成一些复制错误的东西(尽管我不知道上传到哪里) 奇怪的是,如果在抛出异常之前中断,则“o”似乎是正确的类型: o{IRDnet.XMLobj}System.Object 并且该对象在“快速观察”窗口中投射得很好。这些值很容易检查 它是从它所属的同一个项目执行的。因此,没有加载上下文。 仅供参考:如果相关的话,静态方法是XMLobj类的一部分。 还有其他一些我不知道的成功演员的标准吗?任何隐式执行的代码 我已经检查了reflect

下面的代码引发一个异常。如果没有简单的答案或要检查的东西,我会尝试生成一些复制错误的东西(尽管我不知道上传到哪里)

奇怪的是,如果在抛出异常之前中断,则“o”似乎是正确的类型:

o{IRDnet.XMLobj}System.Object

并且该对象在“快速观察”窗口中投射得很好。这些值很容易检查

它是从它所属的同一个项目执行的。因此,没有加载上下文。 仅供参考:如果相关的话,静态方法是XMLobj类的一部分。 还有其他一些我不知道的成功演员的标准吗?任何隐式执行的代码

我已经检查了reflector是否生成了等价的代码,以确保在编译器优化过程中没有丢失任何东西


有什么线索吗,各位?我被难住了。我甚至希望写下这个问题会让我对一些显而易见的事情三思而后行。

这可能是一个版本控制问题。也就是说,反序列化的
XMLobj
与编译时使用的版本不同。检查每种类型的完全限定名。

.NET序列化程序生成{Assembly}.Serializer.dll程序集以加速XML序列化/反序列化。尝试删除每个程序集并从头开始编译

如果程序集不完全匹配,将引发InvalidCast异常


编辑:查看调试器输出以查看已加载的程序集。

更新:

        string tmp = o.GetType().AssemblyQualifiedName;
        string tmp2 = typeof(XMLobj).AssemblyQualifiedName;
产生:

tmp“IRDnet.XMLobj,IRDnet,Version=1.0.3600.18887,Culture=neutral,PublicKeyToken=null”字符串 tmp2“IRDnet.XMLobj,IRDnet,Version=1.0.3601.27699,Culture=neutral,PublicKeyToken=null”字符串

因此,肯定存在合法的类型不匹配。我非常感谢你的帮助。我完全被卡住了。现在我有线索了。现在,我们来看看旧型号是如何在重建中幸存下来的

也许XML文件对此有一些说法。。。。 或者可能是提到的某个地方的秘密序列化程序集

我没有被困住。我还在挖掘,但我想我会告诉你这个新的发展。如果有人有更多关于询问某个类型的声明的技巧,那么请插手。否则,谢谢大家

答复 如果您遇到这种看似相同的类型的异常,首先要做的是检查这两种类型实际上是相同的

System.Type t1 = typeof(XMLobj); 
System.Type t2 = o.GetType(); 
然后在调试器中检查它们。请特别注意“AssemblyQualifiedName”。我的两种类型是同一类的不同版本

然后,在VisualStudio中单步执行时,一定要注意输出窗口。它将告诉您何时加载了哪些程序集。在我的示例中,当我跨过这一行时,罪魁祸首以明文形式出现在调试输出中

XmlSerializer xmlser = new XmlSerializer(typeof(IRDnet.XMLobj));
在那里,调试器显示我的程序集的另一个较旧版本是从我不知道的位置加载的

我忘了告诉这里的人,我使用加载程序集的外部exe进行调试。事实证明,我假设CLR代表XmlSerializer类构造函数来解析“typeof”,它查找exe文件夹及其子文件夹(CLR就是这样做的)。而且,你瞧,我正在修复的IRDnet.dll文件的原始版本中有一个混蛋


我仍然不知道这两个“typeof”语句如何产生不同的结果:一个导致当前上下文中的对象类型,而另一个导致CLR在执行文件夹中查找它。一种可能的理论是,语句的类型在某种程度上被懒散地评估了。我不知道。

o.GetType().FullName显示了什么?你能创建一个IRDnet.XMLobj,在内存中序列化和反序列化它吗?Ruben:string tmp=o.GetType().FullName;字符串tmp2=typeof(XMLobj).FullName;两者都变成了“IRDnet.XMLobj”。o作为IRDnet.XMLobj的值是多少?我的想法是一样的。但是,我希望这会干扰反序列化方法,而不是后续的强制转换。问题的关键似乎是反序列化方法的返回类型。就好像“typeof”在本地范围中得到了除类型声明之外的另一个类型。除了他们的成员和全名之外,还有其他方法来区分类型吗?基于什么因素,演员阵容可能会失败?这听起来非常可信。在某个地方创建了一个奇怪的程序集,它保存着我这种类型的混蛋版本。但是,我在解决方案文件夹或下面找不到任何这样的程序集。我的项目没有在GAC注册,所以除了本地,我看不出有什么理由可以在任何地方注册。序列化程序集是否在运行时生成?啊-是。它们是在运行时创建的。通常你看不到他们。但您可以使用工具生成此类部件。CLR在生成这样的程序集之前首先查找该程序集。查看调试器输出以查看从何处加载程序集。
XmlSerializer xmlser = new XmlSerializer(typeof(IRDnet.XMLobj));