В 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>
делегате .