Si intento una conversión inválida de una clase a una interfaz, entonces el compilador no se queja (el error ocurre en tiempo de ejecución); hace quejarse, sin embargo, si intento un lanzamiento similar a una clase abstracta.¿Por qué no hay error de compilación cuando lanzo una clase a una interfaz que no implementa?
class Program
{
abstract class aBaz
{
public abstract int A { get; }
}
interface IBar
{
int B { get; }
}
class Foo
{
public int C { get; }
}
static void Main()
{
Foo foo = new Foo();
// compiler error, as expected, since Foo doesn't inherit aBaz
aBaz baz = (aBaz)foo;
// no compiler error, even though Foo doesn't implement IBar
IBar bar = (IBar)foo;
}
}
¿por qué el compilador rechazan el reparto de Foo a IBar, cuando es (aparentemente?) No es válida? O, para voltear la pregunta, si el compilador permite este lanzamiento "no válido" a la interfaz IBar, ¿por qué no permite el molde "inválido" similar a la clase abstracta aBaz?
http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx – SLaks
Este casting a una interfaz me mordió en el trasero esta noche ... y lo hizo duele. –
No marcó 'Foo' como' sellado'. Por lo tanto, el reparto explícito se compilará. Podría existir una clase que hereda de 'Foo' que además implementó' IBar'. Si usa 'clase sellada Foo', el lanzamiento a' IBar' será ilegal en tiempo de compilación. (En este caso, la clase 'Foo' está anidada en privado, por lo que incluso si el molde debe permitirse, es concebible que el compilador C# pueda dar un _warning_ (no error ya que la especificación dice que existe una conversión explícita) porque puede ver el alcance completo de la clase anidada. Pero es probable que sea un caso raro.) _Editar: _ Ahora veo que Alexei lo cubre a continuación. –