違いは何である<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のサブクラスとして直接使用できます。FooIComparer<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