从一个超类的泛型集合向下转换为子类

时间:2014-08-07 16:59:31

标签: c# .net oop generics

请考虑以下情形:

public abstract class ClassA
{
    public void SomeMethod();
}

public class ClassB : ClassA
{
    public void MethodForClassB()
    {
    }
}

public class ClassC : ClassA
{
    public void MethodForClassC()
    {
    }
}

public static void Main(string[] args)
{
    var classAList = new List<ClassA>();
    classAList.Add(new ClassB());
    classAList.Add(new ClassC());
}

现在,如果我想这样做:

ClassB retrievedClass = List[0];

因此,我可以在ClassA的子类上执行一个方法,编译器强制我向下转换为特定的子类类型:

ClassB retrievedClass = (ClassB) List[0];

所以我的问题如下:

  1. 为什么框架不会为我做隐式演员,因为类型兼容?
  2. 此操作不是一种拆箱类型,因为您需要转换为特定类型吗?
  3. 与来自对象的向下广播相比,广告投放的成本是多少?
  4. 是否有更好/更有效的方式来存储/访问共享同一个超类的子类。

1 个答案:

答案 0 :(得分:0)

1. Why won't the framework do an implicit cast for me, since the types are compatible?

嗯,类型不兼容。并非每个ClassA都是ClassB,因此当您从列表中检索ClassB时,您需要明确指定要转发到ClassA

2. Isn't this operation a type of unboxing since you need to cast to a specific type?

嗯,不。您在这里没有进行任何拆箱,因为您永远不会从classAList检索任何元素。另外,装箱是将值类型(诸如intchar等原语)转换为引用类型的行为,这在此处不会发生,因此您需要加倍不要拆箱。

3. What is the cost of the downcast as compared to a downcast from an Object?

它们可能具有完全相同的费用,因为ClassBClassC都是ClassAobject的子类。

4. Is there a better/more efficient way to store/access subclasses that share the same superclass?

没有。如果您想存储ClassA列表或任何扩展它的列表,那么您现在正在做的就是您需要做的事情。