=============
ACTUALIZACIÓN: Utilicé esta respuesta como base para esta entrada de blog:
¿Por qué los parámetros ref y out no permiten la variación de tipo?
Consulte la página del blog para obtener más comentarios sobre este tema. Gracias por la gran pregunta.
=============
Supongamos que usted tiene clases Animal, Mammal, Reptile, Giraffe, Turtley Tiger, con las relaciones de subclases obvias.
Ahora suponga que tiene un método void M(ref Mammal m). MPuede leer y escribir tanto m.
¿Se puede pasar una variable de tipo Animala M?
No. Esa variable podría contener a Turtle, pero Msupondrá que solo contiene mamíferos. A Turtleno es a Mammal.
Conclusión 1 : los refparámetros no pueden hacerse "más grandes". (Hay más animales que mamíferos, por lo que la variable se está haciendo "más grande" porque puede contener más cosas).
¿Se puede pasar una variable de tipo Giraffea M?
No. Mpuede escribir my Mpuede querer escribir un correo Tigerelectrónico m. Ahora ha puesto una Tigervariable en una variable que en realidad es de tipo Giraffe.
Conclusión 2 : los refparámetros no pueden hacerse "más pequeños".
Ahora considera N(out Mammal n).
¿Se puede pasar una variable de tipo Giraffea N?
No. Npuede escribir ny Npuede querer escribir a Tiger.
Conclusión 3 : los outparámetros no pueden hacerse "más pequeños".
¿Se puede pasar una variable de tipo Animala N?
Hmm
¿Bueno, por qué no? Nno puede leer n, solo puede escribirle, ¿verdad? Escribes un Tigera una variable de tipo Animaly estás listo, ¿verdad?
Incorrecto. La regla no es " Nsolo se puede escribir n".
Las reglas son, brevemente:
1) Ntiene que escribir nantes de que Nvuelva normalmente. (Si Nlanza, todas las apuestas están canceladas).
2) Ntiene que escribir algo nantes de que lea algo n.
Eso permite esta secuencia de eventos:
- Declarar un campo
xde tipo Animal.
- Pase
xcomo outparámetro a N.
Nescribe un Tigeren n, que es un alias para x.
- En otro hilo, alguien escribe un
Turtleen x.
Nintenta leer el contenido de n, y descubre un Turtleen lo que piensa que es una variable de tipo Mammal.
Claramente queremos que sea ilegal.
Conclusión 4 : los outparámetros no pueden hacerse "más grandes".
Conclusión final : Ni reftampoco outparámetros pueden variar sus tipos. Hacer lo contrario es romper la seguridad de tipo verificable.
Si estas cuestiones en la teoría básica de tipos le interesan, considere leer mi serie sobre cómo funcionan la covarianza y la contravarianza en C # 4.0 .