Cuando el argumento formal de un método es de tipo 'objeto' es posible, a través de la herencia, que el argumento real sea cualquier tipo de objeto. Una vez dentro del método, el objeto se puede convertir al tipo esperado. Todo está bienObjetos, parámetros y la palabra clave ref en C#
Si, sin embargo, la firma del método tiene un argumento formal de 'objeto', usando la palabra clave ref es decir methodname (objeto ref), el compilador genera un error que indica que:
"El mejor método sobrecargado la altura de 'ByRefTest.Program.changeMeByRef (objeto ref)' tiene algunos argumentos no válidos "argumento '1': no se puede convertir de 'ByRefTest.Person ref' a 'objeto ref'".
La diferencia entre usar o no utilizar el ref keword al pasar objetos como parámetros se explica muy bien en el blog de A. Friedman http://crazorsharp.blogspot.com/2009/07/passing-objects-using-ref-keywordwait.html, pero ¿por qué no es posible pasar un tipo personalizado como un argumento real cuando el ¿El argumento formal del tipo 'objeto' usa la palabra clave ref?
Como un ejemplo:
class Program
{
static void Main(string[] args)
{
Person p = new Person();
changeMe(p); // compiles
changeMeByRef(ref p); // throws error
object pObject = (object)p;
changeMeByRef(ref pObject); // compiles
}
public static void changeMeByRef(ref object obj)
{
Person p = (Person)obj;
}
public static void changeMe(object obj)
{
Person p = (Person)obj;
}
}
public class Person
{
}
Gracias.
ps me acaba de cambiar la firma a:
public void changeMeByRef <T> (ref T obj) estática donde T: Persona
esta compila para changeMeByRef (ref p);
Este es un duplicado de http://stackoverflow.com/questions/1207144/c-why-doesnt-ref-and-out-support-polymorphism/1207302#1207302 –