c# - 即使该对象在调试器中看起来具有正确的类型,as 运算符也会拒绝该对象

标签 c# .net casting

以下代码引发异常。如果没有简单的答案或需要检查的内容,我会尝试生成一些可以重现错误的内容(尽管我不知道在哪里上传)。

public static XMLobj Load(string FileName)
{
    if (File.Exists(FileName) == false)
    {
            return null;
    }
    IRDnet.XMLobj def;
    XmlSerializer xmlser = new XmlSerializer(typeof(IRDnet.XMLobj));
    System.IO.Stream stream = File.OpenRead(FileName);
    object o = xmlser.Deserialize(stream);   
        // o appears to be of correct type in the quick watch. 
    IRDnet.XMLobj def2 = o as IRDnet.XMLobj; 
        // def2 is "undefined" (as operator rejected o)
    def = (IRDnet.XMLobj)o;     
        // Throws InvalidCastException with no InnerException.
    stream.Close();
    return def;
}

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

o {IRDnet.XMLobj} System.Object

并且该对象在快速监 window 口中转换得很好。值很容易检查。

它是从它所属的同一项目中执行的。因此,没有加载上下文。 仅供引用:静态方法是 XMLobj 类的一部分(如果相关的话)。 是否还有其他一些我不知道的成功选角标准?有隐式执行的代码吗?

我已经检查了反射器会生成等效的代码,以确保编译器优化中不会丢失任何内容。

各位,有什么线索吗?我很困惑。我什至希望仅仅写下这个问题就能让我对一些完全显而易见的事情三思而后行。

最佳答案

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

关于c# - 即使该对象在调试器中看起来具有正确的类型,as 运算符也会拒绝该对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1707127/

相关文章:

c# - 为什么 Assembly.GetType() 找不到我的类(class)?

.net - Google.Apis.Requests.RequestError 需要登录 [401] 消息[需要登录] 位置

.net - 从 .net 解决方案中删除未使用的 dll

.net 字符串类替代方案

C++ 将基指针转换为接口(interface)指针

c - 只要它们包含 "next"字段,是否可以在 C 中为不同的列表结构编写通用遍历函数?

c# - 什么是逐字字符串?

c# - 我应该在哪里创建一个异常对象?

c# - 如何在转换后的字符串中将字符串生成器转换为没有转义序列的字符串

c++ - 在 MyClass 指针的容器中找到一个 void 指针?