0

C#4.0を使用してSilverlight4アプリケーションを開発しようとしています。私はこのようなケースがあります:

public class Foo<T> : IEnumerable<T>
{
    ....
}

他の場所:

public class MyBaseType : MyInterface
{
    ...
}

そして、私が問題を抱えている使用法:

Foo<MyBaseType> aBunchOfStuff = new Foo<MyBaseType>();
Foo<MyInterface> moreGeneralStuff = myListOFStuff;

ジェネリック型は「不変」だったので、C#3.0ではこれは不可能だったと思います。しかし、これはジェネリックテクノロジーの新しい共分散によってC#4.0で可能だと思いましたか?

私が理解しているように、C#4.0では、分散をサポートするために多くの一般的なインターフェイス(IEnumerableなど)が変更されています。この場合、Foo共変になるために私のクラスは何か特別なことをする必要がありますか?

また、Silverlight 4(RC)では共分散がサポートされていますか?

4

2 に答える 2

4

インターフェイスまたはデリゲートのジェネリック型パラメーターがで共変であることを示すには、キーワードを指定Tする必要があります。out

ただし、これは現在、クラスでは不可能です。共変ジェネリック型パラメーターを使用してインターフェースを作成し、クラスに実装させることをお勧めします。

Silverlight 4での共分散のサポートについては、ベータ版ではサポートされていなかったため、リリース候補に実装されているかどうかを確認する必要があります。編集:どうやらそうです。

Edit2:BCLの一部の型には適切な汎用型修飾子が設定されていないため、SL4が実際にインターフェースとデリゲートの共変性と反変性をサポートするかどうかについて混乱が生じる可能性があります(、、、、IEnumerable<T>... ) 。Action<T>Func<T>

Silverlight 5は、これらの問題に対処します:http: //10rem.net/blog/2011/09/04/the-big-list-of-whats-new-or-improved-in-silverlight-5

ただし、 SL4コンパイラinおよびout修飾子をサポートしています。以下は、期待どおりにコンパイルおよび動作します。

interface IFoo<out T>
{
    T Bar { get; }
}
interface IBar<in T>
{
    void Add(T value);
}
delegate void ContravariantAction<in T>(T value);
delegate T CovariantFunc<out T>();
于 2010-04-01T06:44:09.343 に答える
1

共分散は、インターフェースとデリゲートでのみサポートされます。

public interface Foo<out T> { }
public class Bar<T> : Foo<T> { }

interface MyInterface { }
public class MyBase : MyInterface { }

Foo<MyBase> a = new Bar<MyBase>();
Foo<MyInterface> b = a;

重要なのは、outインターフェイスの-KeywordFooです。

于 2010-04-01T06:41:59.597 に答える