c#铸造问题

时间:2010-01-10 05:52:16

标签: c# casting

如果我有以下课程:

public class MyItems : List<MyItem>
{
..
}

public class MyItem : Item
{
..
}

我怎样才能将MyItems的实例强制转换为List<Item>?我已经尝试过做一个明确的演员,我得到了一个例外。

3 个答案:

答案 0 :(得分:8)

你不能,因为C#不支持通用方差(see here for discussion of terminology),即使它确实如此,也不会允许这种情况,因为如果你可以将MyItems转换为List<Item> ,你可以调用Add(someItemThatIsntAMyItem),这会违反类型安全(因为MyItems只能包含MyItem对象,而不是任意项)。

请参阅this question(或搜索SO以了解“c#generic variance”)以获取有关此问题的其他信息以及C#4中的未来更改(尽管这些不会影响您的具体情况)。

答案 1 :(得分:0)

我相信我看到的是4.0。还没有。

答案 2 :(得分:0)

public class MyList : IList<MyClass>
{
    List<MyClass> _list;


    //Implement all IList members like so
    public int IndexOf(MyClass item)
    {
        return _list.IndexOf(item);
    }


    //Then help the type system a bit with these two static methods.
    public static implicit operator List<MyClass> (MyList mylist)
    {
        return mylist._list;
    }

    public static implicit operator MyList (List<MyClass> list)
    {
        return new MyList() { _list = list;}
    }