Ich habe die Auswirkungen des Aufrufs eines virtuellen Members in einem Konstruktor getestet und festgestellt, dass beim Aufrufen dieses Members die resultierende Ausnahme in eine TargetInvocationException
eingeschlossen wurde.Werden virtuelle Mitglieder über Reflektion (unter normalen Umständen) aufgerufen?
Nach dem docs dies:
Die Ausnahme, die durch Verfahren, durch Reflexion aufgerufen geworfen wird
Allerdings bin ich von irgendwelchen invokations durch Reflexion nicht bewusst. Also heißt das bedeuten virtuelle Mitglieder werden immer über Reflexion aufgerufen? Wenn nicht, warum ist es so in diesem Fall?
Der Code:
class ClassA
{
public ClassA()
{
SplitTheWords();
}
public virtual void SplitTheWords()
{
//I've been overidden
}
}
class ClassB : ClassA
{
private readonly String _output;
public ClassB()
{
_output = "Constructor has occured";
}
public override void SplitTheWords()
{
String[] something = _output.Split(new[]{' '}); //TargetInvocationException!
}
}
+1 für "leicht irreführend", das ist eine sehr verwirrende Sache für die Ärzte zu sagen. Man könnte eine Konsolen-App schreiben, die nichts außer "throw new TargetInvocationException();" - wo wäre die Reflektion dann? – AakashM
Ich verstehe _why_ virtuelle Mitglieder sollten nicht von Konstruktoren aufgerufen werden, das ist, was mich dazu veranlasste, dies auszuprobieren –
@ m.edmondson Entschuldigung, ich habe dies aus Ihrer Zeile über "Ich habe die Auswirkungen von ... getestet", ich Ich wollte nicht, dass meine Antwort herablassend ist (aber ich denke, dass es jetzt so sein mag), ich habe die letzten Absätze nur für die Vollständigkeit der anderen, die diese Antwort sehen, eingefügt. Ich werde versuchen, umzuformulieren. –