使用'as'进行C#强制转换

时间:2014-02-10 11:15:34

标签: c# list inheritance casting

我有以下代码:

public class BaseClass {}
public class Class1 : BaseClass {}
public class Class2 : BaseClass {}

public class BaseClassList : List<BaseClass> {}
public class Class1List : List<Class1> {}
public class Class2List : List<Class2> {}

    public void Setup()
    {
        BaseClassList b = new BaseClassList();
        b.Add(new BaseClass());
        b.Add(new BaseClass());
        b.Add(new BaseClass());

        var list = from a in b
                   select a;

        Class1List c1 = new Class1List();

        foreach (BaseClass a in b)
        {
            var o = a as Class1;
            if (o != null)
                c1.Add(o);
        }
    }

但是,在将类型1转换为类时,a始终为null。有什么问题?

3 个答案:

答案 0 :(得分:5)

问题是a不是Class1对象。就这样。 再次仔细阅读您的代码 - 为什么您认为BaseClass对象可以被转换为一个派生自它的类?

答案 1 :(得分:3)

根据您的代码,

因为aBaseClass

...
 b.Add(new BaseClass());
 b.Add(new BaseClass());
 b.Add(new BaseClass());
...

并且您无法将 base 类强制转换为 child 类,您必须这样做,反之亦然。

示例:

  ...

    b.Add(new Class1());
    b.Add(new Class1());
   ...   

之后这是正确的:

foreach (var a in b)
{
    var o = a as Class1;//CORRECT.      
}

答案 2 :(得分:0)

因为您正在将基类强制转换为超类。 这就像告诉编译器“人”总是“软件开发人员”,它应该是相反的方式。因此,“软件开发人员”始终是“人”,“会计师”也是“人”。

因此, “BaseClass”是指“人”; “Class1”是“软件开发人员”; “Class2”是“会计”

因此,您应该将“Software Developer / Class1”或“Accountant / Class2”的实例添加到“Person”列表中,该列表是BaseClassList。

然后将BassClass标记为抽象。