Der folgende Code wirft eine Ausnahme. Wenn es keine einfache Antwort oder Dinge zu überprüfen gibt, werde ich versuchen, etwas zu produzieren, das den Fehler reproduziert (obwohl ich nicht weiß, wo ich es hochladen soll).
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 scheint im Quickwatch vom richtigen Typ zu sein.
IRDnet.XMLobj def2 = o as IRDnet.XMLobj;
// def2 ist "undefiniert" (da der Operator o abgelehnt hat)
def = (IRDnet.XMLobj)o;
// Wirft InvalidCastException ohne InnerException.
stream.Close();
return def;
}
Das Seltsame daran ist, dass "o" als korrekter Typ erscheint, wenn ich kurz vor dem Auswerfen der Ausnahme anhalte:
o {IRDnet.XMLobj} System.Object
Und das Objekt lässt sich problemlos im Quickwatch-Fenster umwandeln. Werte können problemlos inspiziert werden.
Es wird aus demselben Projekt ausgeführt, zu dem es gehört. Also keine Ladevorgänge. FYI: Die statische Methode ist Teil der Klasse XMLobj, falls das relevant ist. Gibt es vielleicht andere Kriterien für eine erfolgreiche Umwandlung, von denen ich nicht weiß? Wird irgendwelcher Code implizit ausgeführt?
Ich habe überprüft, ob Reflector den äquivalenten Code erzeugt, um sicherzustellen, dass durch Compileroptimierung nichts verloren gegangen ist.
Irgendwelche Hinweise, Leute? Ich bin ratlos. Ich habe sogar gehofft, dass nur das Schreiben dieser Frage mich dazu bringen würde, noch einmal über etwas komplett Offensichtliches nachzudenken.