0
public abstrct class Item
{
   public string Name {get;set;}
}

public class Music : Item
{
    public double Price {get;set;} 
}

public class Game : Item
{
  public string Image {get;set;}
}

public class Inventory
{

private IList<Item> _games;
private IList<Item> _musics;

public Inventory()
{
  _games = new List<Item>();
  _musics = new List<Item>();
}

public void Add<T>(T item) where T : Item
{
if(typeof(T) == typeof(Game))
{
    _game.add(item);
}
if(typeof(T) == typeof(Music))
{
    _muisc.add(item);
}


public List<T> GetCollection<T>() where T : Item
{
  return (List<T>) _muiscs;
}

class Porgram
{
  static void Main(string[] args)
{
   Inventory inventory = new Inventory();
   var music1 = new Music(){ Name ="aa", Price = 10};
   var Music2 = new Music() { Name ="bb", price = 20 };

inventory.add(music1);
inventory.add(music2);


List<Music> myMusics = inventory.GetCollection<Music>();


}

コードはコンパイルされますが、GetCollectionメソッドを呼び出そうとすると例外がスローされます。

本当に理由がわかりませんか?私は一般的な間違ったものを使用していると思います。

4

3 に答える 3

2

List<Item>をList<Music>にキャストすることはできません。MusicはItemのサブクラスですが、ジェネリック型はコレクション型と同じ継承パターンに従いません。コードを修正する最も簡単な方法は、GetCollectionメソッドのキャストをLinq拡張メソッドのキャストの呼び出しに置き換えてからToListを呼び出すことです。そうは言っても、この種の継承をより適切に処理するために、クラス全体を再設計できると思います。

したがって、GetCollectionメソッドは次のようになります。

public List<T> GetCollection<T>() where T : Item
{
    return _musics.Cast<T>().ToList();
}
于 2012-10-24T21:52:55.417 に答える
0

GetCollectionメソッドを次のように変更するだけです

public List <T> GetCollection<T>() where T :Item
        {

            if (typeof(T) == typeof(Game))
            {
                return _games.Cast<T>().ToList();
            }
            if (typeof(T) == typeof(Music))
            {
                return _musics.Cast<T>().ToList(); ;
            }
        return null;
        }
于 2012-10-24T22:01:35.950 に答える
0

このコードを試してください:

public abstract class Item
{
    public string Name { get; set; }
}

public class Music : Item
{
    public double Price { get; set; }
}

public class Game : Item
{
    public string Image { get; set; }
}

public class Inventory<E> where E : Item
{

    private IList<E> _games;
    private IList<E> _musics;

    public Inventory()
    {
        _games = new List<E>();
        _musics = new List<E>();
    }

    public void Add(E item)
    {
        if (typeof(E) == typeof(Game))
        {
            _games.Add(item);
        }
        if (typeof(E) == typeof(Music))
        {
            _musics.Add(item);
        }
    }


    public List<E> GetCollection()
    {
        return _musics;
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Inventory<Item> inventory = new Inventory<Item>();
        var music1 = new Music() { Name = "aa", Price = 10 };
        var music2 = new Music() { Name = "bb", Price = 20 };

        inventory.Add(music1);
        inventory.Add(music2);


        List<Item> myMusics = inventory.GetCollection();


    }
}

Inventoryクラスを汎用として宣言する必要があります。この場合、Inventoryクラスは拡張するクラスを取ります。Item

また:あなたがコードを書いたようで、それをコピーして貼り付けなかったようです...なぜあなたがそれをしたのかわかりません...

于 2012-10-24T21:51:40.610 に答える