У C # out
ключове слово можна використовувати двома різними способами.
Як модифікатор параметра, в якому аргумент передається за посиланням
class OutExample { static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 } }
Як модифікатор параметрів типу для визначення коваріації .
// 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; } }
Моє запитання: чому?
Початківцю зв’язок між ними не здається інтуїтивно зрозумілим . Використання з дженериками, схоже, не має нічого спільного з проходженням посилання.
Я вперше дізнався, що out
стосується передачі аргументів шляхом посилання, і це перешкоджало моєму розумінню використання визначення визначальної коваріації з дженериками.
Чи існує зв’язок між цими напрямами, які мені не вистачає?
System.Func<in T, out TResult>
делегаті .