2

かなり自明の質問です、どんな答えでもうれしいです。私にとってそれは意味がありません。情報を失うことは気にしません。どういうわけかIRenderableを継承するすべてのリストを1つのリストに連結してから、そのリストでIRenderableメソッドを呼び出したいだけです。これが私が忘れていたプログラミングの基本的なルールだと感じています...

編集:これはコードです:

interface IRenderable
{
    void Render();
}
interface IScreen : IRenderable
{
}
public List<IScreen> Screens = new List<IScreen>();
List<IRenderable> renderList = new List<IRenderable>();
renderList = ((List<IRenderable>)Screens; // error: cannot convert type IScreen to IRenderable

edit2:ところで、.net 4.0をインストールしましたが、参照はSystem.dllバージョン2.0.5.0のままです。

4

3 に答える 3

2

私の推測では、あなたは本当にList<IScreen>からList<IRenderable>または同様のものに変換しようとしています。

一般的な不変性のため、.NET4より前ではこれを行うことはできません。.NET 4では、必要に応じてインターフェースとデリゲートに対してこれを行うことができます。IEnumerable<IScreen>特に、からに変換できますIEnumerable<IRenderable>。リストを連結しようとしているだけの場合は、問題ありません。各リストで使用できるはずList<T>.AddRangeです...ただし、これはC#4でのみ適用されます。C#4の別のオプションは次のようになります。

var combined = firstList.Concat<IRenderable>(secondList).ToList();

これが常に安全であるとは限らない理由の例として( C#4で許可されている使用法は安全です)、次のコードを検討してください。

List<Apple> apples = new List<Apple> { new Apple(...) };
List<Fruit> fruit = apples;
fruit.Add(new Orange());

これで、参照するリストにapplesオレンジが含まれます。これは、型安全性の観点からは明らかに良いことではありません。

driisが言うように、あなたがより多くの詳細(例えばあなたが持っているものとあなたが欲しいもの)を与えることができれば、私たちはもっと助けることができるはずです。

于 2010-05-24T10:11:32.853 に答える
1

あなたは多くの詳細を与えません。しかし、あなたが持っていると仮定しましょう:

IRenderable {}

IScreen : IRenderable {}

private List<IRenderable> ConcatLists(IEnumerable<IRenderable> first, IEnumerable<IRenderable> second) { ... }

これで、C#4より前のC#バージョンでは、IEnumerable<IScreen>を使用してConcatListsメソッドを直接呼び出すことができなくなります。この理由は、共変性と反変性と呼ばれます。フレームワーク4では、IEnumerable <T>は共変として宣言されています。つまり、Tがより少ないタイプ(この場合はIRenderable)であるIEnumerableに暗黙的に変換できます。

C#3でこのようなメソッドを呼び出したい場合は、拡張メソッドを使用すると便利です。

これは次のようになります。

ConcatLists(first.Cast<IRenderable>(), second);

「最初の」がタイプIRenderableであると宣言された場合。

于 2010-05-24T10:13:04.043 に答える
1

List<T0>にキャストできませんList<T1>。リストのすべての要素に対してキャストを行う必要があります。IEnumarableのCast拡張機能は次のとおりです。

List<IScreen> Screens = new List<IScreen>();
List<IRenderable> renderList = Screens.Cast<IRenderable>().ToList();
于 2010-05-24T11:30:42.423 に答える