違いは何である<out T>
とは<T>
?例えば:
public interface IExample<out T>
{
...
}
対
public interface IExample<T>
{
...
}
違いは何である<out T>
とは<T>
?例えば:
public interface IExample<out T>
{
...
}
対
public interface IExample<T>
{
...
}
回答:
out
ジェネリックのキーワードは、インターフェイスのタイプTが共変であることを示すために使用されます。詳細については、共分散と反分散を参照してください。
典型的な例はIEnumerable<out T>
です。IEnumerable<out T>
は共変なので、次のことを実行できます。
IEnumerable<string> strings = new List<string>();
IEnumerable<object> objects = strings;
上記の2行目は、文字列がオブジェクトから派生しているため、論理的には機能するはずですが、これが共変でない場合は失敗します。ジェネリックインターフェイスの差異が C#およびVB.NET(VS 2010を搭載した.NET 4)に追加される前は、これはコンパイル時エラーでした。
.NET 4以降、IEnumerable<T>
は共変とマークされ、になりましたIEnumerable<out T>
。以来IEnumerable<out T>
のみが、その中の要素を使用しないので、決して追加/それはそれの意味オブジェクトの列挙可能なコレクションとして、文字列の列挙コレクションを処理するためにも安全だ、それらを変更する共変します。
メソッドがあるIList<T>
ため、これIList<T>
はのようなタイプでは機能しませんAdd
。これが許可されると仮定します:
IList<string> strings = new List<string>();
IList<object> objects = strings; // NOTE: Fails at compile time
次に呼び出すことができます:
objects.Add(new Image()); // This should work, since IList<object> should let us add **any** object
もちろん、これは失敗します-したがって、IList<T>
共変とマークすることはできません。
また、btwというオプションもありin
ます。これは、比較インターフェースなどで使用されます。 IComparer<in T>
たとえば、逆の動作をします。インターフェースは反変なので、具象IComparer<Foo>
をIComparer<Bar>
if Bar
のサブクラスとして直接使用できます。Foo
IComparer<in T>
Image
は抽象クラスなので、;)new List<object>() { Image.FromFile("test.jpg") };
問題なく実行することもnew List<object>() { new Bitmap("test.jpg") };
、実行することもできます。あなたの問題new Image()
は許可されていないことです(あなたもvar img = new Image();
どちらもできません)
IList<object>
は奇妙な例object
です。sが必要な場合、ジェネリックは必要ありません。
簡単の使い方覚えるためin
やout
ラッピングなどのキーワード(また、共変性と反変性)、我々はできる画像の継承を:
String : Object
Bar : Foo
考えて、
class Fruit {}
class Banana : Fruit {}
interface ICovariantSkinned<out T> {}
interface ISkinned<T> {}
そして機能、
void Peel(ISkinned<Fruit> skinned) { }
void Peel(ICovariantSkinned<Fruit> skinned) { }
受け入れる関数は受け入れるICovariantSkinned<Fruit>
ことができるICovariantSkinned<Fruit>
かICovariantSkinned<Bananna>
、またはICovariantSkinned<T>
共変インターフェイスでBanana
あり、のタイプであるためFruit
、
受け入れる関数は受け入れるISkinned<Fruit>
ことができるだけISkinned<Fruit>
です。
投稿したリンクから...
ジェネリック型パラメーターの場合、outキーワードは、型パラメーターが共変であることを指定します。
編集:もう一度、あなたが投稿したリンクから
詳細については、「共分散と反変(C#およびVisual Basic)」を参照してください。http://msdn.microsoft.com/en-us/library/ee207183.aspx