En C #, la out
palabra clave se puede usar de dos maneras diferentes.
Como modificador de parámetros en el que se pasa un argumento por referencia
class OutExample { static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 } }
Como modificador de parámetros de tipo para especificar la covarianza .
// Covariant interface. interface ICovariant<out R> { } // Extending covariant interface. interface IExtCovariant<out R> : ICovariant<R> { } // Implementing covariant interface. class Sample<R> : ICovariant<R> { } class Program { static void Test() { ICovariant<Object> iobj = new Sample<Object>(); ICovariant<String> istr = new Sample<String>(); // You can assign istr to iobj because // the ICovariant interface is covariant. iobj = istr; } }
Mi pregunta es: ¿por qué?
Para un principiante, la conexión entre los dos no parece intuitiva . El uso con genéricos no parece tener nada que ver con pasar por referencia.
Primero aprendí lo que out
estaba relacionado con pasar argumentos por referencia, y esto dificultó mi comprensión del uso de la definición de covarianza con genéricos.
¿Hay una conexión entre estos usos que me falta?
System.Func<in T, out TResult>
delegado .