<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(VS2010を使用する.NET4)に追加される前は、これはコンパイル時のエラーでした。
.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>
共変としてマークすることはできません。
in
ところで、比較インターフェースなどで使用される- のオプションもあります。IComparer<in T>
たとえば、逆の方法で機能します。インターフェイスは反変であるため、のサブクラスであるifとして具象IComparer<Foo>
を直接使用できます。IComparer<Bar>
Bar
Foo
IComparer<in T>
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<Banana>
ICovariantSkinned<T>
Banana
Fruit
受け入れる関数は、ISkinned<Fruit>
のみ受け入れることができますISkinned<Fruit>
。
「out T
」は、タイプT
が「共変」であることを意味します。T
これにより、ジェネリッククラス、インターフェイス、またはメソッドのメソッドで戻り値(アウトバウンド)としてのみ表示されるように制限されます。これは、type / interface/methodをスーパータイプが。の同等のものにキャストできることを意味しますT
。
たとえばICovariant<out Dog>
、にキャストできますICovariant<Animal>
。
あなたが投稿したリンクから...
ジェネリック型パラメーターの場合、outキーワードは、型パラメーターが共変であることを指定します。
編集:繰り返しますが、あなたが投稿したリンクから
詳細については、共変性と反変性(C#およびVisual Basic)を参照してください。http://msdn.microsoft.com/en-us/library/ee207183.aspx