2012-04-05 2 views
19

Я только что видел незнакомый синтаксис, ища GroupBy тип возвращаемого значения:Что означает «out» перед параметром Generic type?

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

MSDN Source

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

Что означает out в общем типе?

+1

Это * Общий модификатор *. См. MSDN http://msdn.microsoft.com/en-us/library/dd469487.aspx –

+3

с разрешением 12 тыс., По крайней мере, на [MSDN] (http://msdn.microsoft.com/en-us/library/ dd469487.aspx), прежде чем спрашивать? – Reniuz

+0

@Reniuz. Я нашел там только ссылку «out». Извините ... – gdoron

ответ

9

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

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

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

См. out (Generic Modifier) и in (Generic Modifier) на MSDN.

+0

Я знаю термины [контравариантность и ковариация] (http://msdn.microsoft.com/en-us/library/ee207183.aspx), но По-моему, примеры MSDN не описывают модификаторы 'in' и' out' для Generics. Можете ли вы привести несколько примеров, которые легче понять? – Matt

+1

Это всего лишь копия/вставка из MSDN. Ответ Фрэнка должен был быть принят, а не это. –

+0

@SergeyAkopov - Вы, безусловно, имеете право на свое мнение, но принятие или нет - это совсем то, что решает вопрос. – Oded

4

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

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

5

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

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

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

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

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

+0

Я предполагаю, что вы имели в виду 'открытый интерфейс Foo ' (вместо 'out') в вашем втором примере, я прав? – Matt

+0

@Matt К сожалению, вы правы. Спасибо, исправлено. –

+0

@ralzarek у вас есть это в обратном порядке: вне ковариант и в контраварианте – BaltoStar

14

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

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

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

Смежные вопросы