Estaba probando los efectos de llamar a un miembro virtual en un constructor, y descubrí que al llamar a ese miembro, la excepción resultante se ajustaba a TargetInvocationException
.¿Los miembros virtuales se llaman mediante reflejo (en circunstancias normales)?
De acuerdo con la docs esto es:
La excepción que se produce por métodos invocados por la reflexión
Sin embargo estoy al tanto de ninguna invokations a través de la reflexión. Entonces, ¿esto quiere decir que los miembros virtuales medios siempre se llaman a través de la reflexión? Si no, ¿por qué es así en este caso?
El código:
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 por "ligeramente engañoso", eso es algo profundamente confuso para los doctores. Se podría escribir una aplicación de consola que no hizo nada excepto 'throw new TargetInvocationException();' - ¿dónde estaría el reflejo entonces? – AakashM
Entiendo _por qué_ los miembros virtuales no deberían ser llamados por los constructores, esto es lo que me impulsó a probar esto –
@ m.edmondson Disculpas, entendí esto de su línea sobre 'Estaba probando los efectos de ...', no tenía la intención de que mi respuesta fuera condescendiente (pero creo que ahora puede ser así), simplemente incluí los últimos párrafos para que sean completos para otros que ven esta respuesta. Trataré de reformular. –