GroupBy
リターンタイプを探しているときに、なじみのない構文を見たところです。
public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>
out
メソッドで何を意味するの かは知っていますが、ジェネリックスインターフェースではわかりません。
out
ジェネリック型とはどういう意味ですか?
共変パラメータを示します。MSDNの説明も参照してください。本質的にそれは、それIGrouping<Aderived, Bderived>
はと見なすことができると言うIGrouping<Abase, Bbase>
ので、あなたは
IGrouping<Aderived, Bderived> gr = MakeGrouping(...);
IGrouping<Abase, Bbase> grBase = gr;
ifAderived
は、から派生したインターフェイスまたはタイプAbase
です。これは、タイプのパラメーターを必要とするメソッドを呼び出したいが、IGrouping<Abase, Bbase>
タイプのオブジェクトしか取得できない場合に便利な機能ですIGrouping<Aderived, Bderived>
。この場合、タイプパラメータの共分散により、両方のタイプは同等であると見なすことができます。
これは、C#4.0(Visual Studio 2010)で導入された2つの汎用修飾子の1つです。
これは、宣言されているジェネリックパラメーターが共変であることを意味します。
in
修飾子は、それが宣言されているジェネリックパラメーターが反変であることを示します。
MSDNの(Generic Modifier)および(Generic Modifier)を参照してください。
outは、タイプが出力にのみ使用されることを意味します。
public interface Foo<out T>
{
T Bar()
}
タイプが入力にのみ使用されることを意味する修飾子もあります。
public interface Foo<in T>
{
int Bar(T x)
}
これらが使用されるのは、inのあるインターフェースはTで共変であり、outのあるインターフェースはTで反変であるためです。
out
このコンテキストでのキーワードは、対応するタイプパラメーターが簡単に言えば共分散であることを示します。共分散を使用すると、ジェネリックパラメーターで指定されたタイプよりも派生したタイプを使用できます。
ところで、共分散と反変性について詳しく理解するには、Eric Lippertのこの10部シリーズを参照してください:http://blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in- c-part-one.aspx