3 Stimmen

Warum kann Down-Casting nicht zur Kompilierzeit überprüft werden?

Warum kann der Compiler nicht zur Compilierzeit erkennen, dass obj verweist auf ein Objekt des Typs B und meldet daher einen Fehler, wenn wir versuchen, ihn in den Typ A ?

public class A { }
public class B { }

static void Main(string[] args)
{
   B b = new B();
   object obj = (object)b;
   A a = (A)obj; // exception

Vielen Dank

1voto

Josh Punkte 66190

Denn Sie würden tagelang dasitzen, während die Compiler jeden möglichen Weg durch Ihren Code ausprobieren.

1voto

Draemon Punkte 32703

Wie bereits von anderen erwähnt, besteht das allgemeine Problem darin, dass der Compiler alle möglichen Ausführungspfade zurückverfolgen müsste, um festzustellen, woher die Variable stammen könnte - und dann zu ermitteln, ob der Cast gültig ist.

Stellen Sie sich vor, das Objekt wird an die Funktion übergeben, die es dann herunterwirft. Der Compiler müsste den Laufzeittyp des übergebenen Objekts kennen. Der aufrufende Code existiert möglicherweise nicht einmal zur Kompilierzeit, wenn es sich um eine Bibliothek handelt.

1voto

Tim Trout Punkte 1062

In einem einfachen Beispiel wie dem Ihren könnte man meinen, dass es für einen Compiler ein Leichtes wäre, intelligent nach allen Verweisen auf ein bestimmtes Objekt zu suchen und dann festzustellen, ob es illegal gecastet wurde. Aber betrachten Sie dieses Gegenbeispiel:

public class A { } 
public class B { } 

static void Main(string[] args) 
{ 
   B b = new B(); 
   object obj = (object)b;
   // re-using the obj reference
   obj = new A();
   A a = (A)obj; // cast is now valid

Es gibt so viele mögliche Permutationen von Möglichkeiten, wie man eine bestimmte Basisreferenz wiederverwenden und umwandeln kann, dass ein Compiler-Autor dies voraussehen müsste. Noch komplizierter wird es, wenn die obj-Referenz in einem Parameter an eine Methode übergeben wird. Die Überprüfung zur Kompilierzeit wird nicht-deterministisch, was die Kompilierungszeiten potenziell viel länger macht und immer noch nicht garantiert, dass alle ungültigen Casts abgefangen werden können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X