Подтвердить что ты не робот

Что означает "out" перед параметром Generic type?

Я только что увидел незнакомый синтаксис при поиске типа возврата GroupBy:

public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>

Источник MSDN

Я знаю, что означает out в методах, но не в интерфейсе generics.

Что означает out в родовом типе?

4b9b3361

Ответ 1

Это один из двух универсальных модификаторов, представленных в С# 4.0 (Visual Studio 2010).

Это означает, что общий параметр, который он объявляет, является ковариантным.

Модификатор in означает, что общий параметр, объявленный им, является контравариантным.

Смотрите out (Generic Modifier) ​​ и в (Generic Modifier) ​​ на MSDN.

Ответ 2

Он обозначает параметр ковариантный. См. Также описание MSDN. По существу, он говорит, что IGrouping<Aderived, Bderived> можно рассматривать как IGrouping<Abase, Bbase>, поэтому вы можете

IGrouping<Aderived, Bderived> gr = MakeGrouping(...);
IGrouping<Abase, Bbase> grBase = gr;

if Aderived - это интерфейс или тип, полученный из Abase. Это функция, которая пригодится, когда вы хотите вызвать метод, для которого требуется параметр типа IGrouping<Abase, Bbase>, но вы получили только объект типа IGrouping<Aderived, Bderived>. В этом случае оба типа можно считать эквивалентными из-за ковариации их параметров типа.

Ответ 3

out означает, что тип используется только для вывода, например.

public interface Foo<out T>
{
   T Bar()
}

Также существует модификатор, который означает, что этот тип используется только для ввода, например.

public interface Foo<in T>
{
    int Bar(T x)
}

Они используются потому, что интерфейсы с in ковариантны в T и интерфейсы с out контравариантны в T.

Ответ 4

В этом контексте ключевое слово

out указывает на то, что соответствующий тип параметра является ковариантным простым языком. Ковариация позволяет использовать более производный тип, чем тот, который задан общим параметром.

Кстати, см. эту десятую часть серии от Эрика Липперта, чтобы больше узнать о ковариации и противоречивости: http://blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx