[英]What does "out" mean before a Generic type parameter?
我剛剛在尋找GroupBy
返回類型時看到了一個不熟悉的語法:
public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>
我知道out
在方法中是什么意思,但在 generics 接口中不知道。
out
在泛型中是什么意思?
它表示一個協變參數。 另請參閱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>
類型的 object。 在這種情況下,由於類型參數的協變性,兩種類型都可以被認為是等價的。
它是 C# 4.0 (Visual Studio 2010) 中引入的兩個通用修飾符之一。
它表示聲明它的泛型參數是協變的。
in
修飾符表示聲明它的泛型參數是逆變的。
請參閱 MSDN 上的(Generic Modifier)和in (Generic Modifier) 。
out 只是表示該類型僅用於 output 例如
public interface Foo<out T>
{
T Bar()
}
還有一個修飾符,表示該類型僅用於輸入,例如
public interface Foo<in T>
{
int Bar(T x)
}
使用這些是因為帶有 in 的接口在 T 中是協變的,而帶有 out 的接口在 T 中是逆變的。
out
關鍵字在此上下文中表示相應的類型參數是協變的 - 協變使您能夠使用比泛型參數指定的派生類型更多的類型。
順便說一句,請參閱 Eric Lippert 的這十部分系列以了解有關協方差和反方差的更多信息: http://blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in- c-part-one.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.