Em C #, a out
palavra - chave pode ser usada de duas maneiras diferentes.
Como um modificador de parâmetro no qual um argumento é passado por referência
class OutExample { static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 } }
Como um modificador de parâmetro de tipo para especificar covariância .
// 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; } }
Minha pergunta é: por que?
Para um iniciante, a conexão entre os dois não parece intuitiva . O uso com genéricos não parece ter nada a ver com a passagem por referência.
Aprendi pela primeira vez o que out
havia em relação à passagem de argumentos por referência, e isso dificultou minha compreensão do uso da definição de covariância com genéricos.
Existe uma conexão entre esses usos que estou perdendo?
System.Func<in T, out TResult>
delegado .