1

.NET2.0グーグルとSOを検索しているにもかかわらず、これを行う方法を見つけることができないようです。

次のクラスがあるとします。

public class Fruit {
    prop string Color {get; set;}
}

public class Apple : Fruit {
    public Apple() {
        this.Color = "Red";
    }
}

public class Grape: Fruit {
    public Grape() {
        this.Color = "Green";
    }
}

今私はこれをしたい:

public List<Fruit> GetFruit() {
    List<Fruit> list = new List<Fruit>();
    // .. populate list ..
    return list;
}    


List<Grape> grapes = GetFruit();

しかしもちろん私は得Cannot implicitly convert type Fruit to Grapeます。

これは、次のようにすると本当に混乱する可能性があるためです。

List<Grape> list = new List<Grape>();
list.add(new Apple());

どちらもですがFruit、はでAppleはないからGrapeです。だからそれは理にかなっています。

しかし、なぜこれができないのかわかりません。

List<Fruit> list = new List<Fruit>();
list.add(new Apple());
list.add(new Grape());

少なくとも、次のことができる必要があります。

List<Fruit> list = new List<Fruit>();
list.add(new Apple());   // will always be Apple
list.add(new Apple());   // will always be Apple
list.add(new Apple());   // will always be Apple

これを行う方法についてのアイデアはあり.NET2ますか?

ありがとう

編集

すみません、私は間違っていました。私は実際に行うことができます:

List<Fruit> list = new List<Fruit>();
list.add(new Apple());
list.add(new Grape());

.FindAll.Convertトリックを行いました。

4

4 に答える 4

4

私はあなたがこれを行うことができると100%確信しています:

List<Fruit> list = new List<Fruit>();
list.add(new Apple());
list.add(new Grape());

.net 2.0に固執したい特別な理由はありますか?

.net 3.5を使用すると、次の2つの可能性があります。

List<Apple> apples = list.OfType<Apple>().ToList();

これにより、リストがフィルタリングされ、リンゴのリストが返されます。あなたも持っています:

List<Apple> apples = list.Cast<Apple>().ToList();

これはフィルタリングしませんが、リスト内のすべての要素がリンゴであると想定します(そうでない場合はthrowとInvalidCastException)。

于 2012-10-29T15:02:11.870 に答える
2

.Net 2.0最初に特定のものが必要なので、FindAllを使用してそれぞれをフィルタリングし、次にConvertAllを使用します。

List<Grape> grapes = list
  .FindAll(delegate(Fruit f) { return f is Grape; })
  .ConvertAll<Grape>(delegate(Fruit f) { return f as Grape; });

あなたの質問に関して:

しかし、なぜこれができないのかわかりません。

List<Fruit> list = new List<Fruit>();
list.Add(new Apple());
list.Add(new Grape());

あなたはこれを行うことができます、それは完全に有効です、あなたは何かをタイプミスしましたか(追加対追加)?

于 2012-10-29T14:53:05.667 に答える
2

.NETの新しいバージョンでも、リストが共変になることはありません(列挙可能ファイルは共変です)。

などはすでに正常に動作しているlist.Add(new Apple())はずです-それで問題はありません。

割り当てのために、あなたは次のようなことをしなければならないかもしれません:

List<Grape> grapes = GetFruit().ConvertAll(x => (Grape)x);

または古いコンパイラの場合:

List<Grape> grapes = GetFruit().ConvertAll<Grape>(delegate(Fruit x) {
    return (Grape)x;
});

(これは意味的に同一です)

于 2012-10-29T15:00:37.857 に答える
0

ブドウがオブジェクトのみを返すことが確実な場合はGrape、LINQCastを使用できます。

Enumerable.Castメソッド

List<Garapes> grapes = GetFruit().Cast<Grape>().ToList();

変換を行う前に、 LINQWhereを使用してブドウである果物のみを取得することもできます

Where(f => f is Grape)

于 2012-10-29T15:07:38.783 に答える