Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C使用“as”进行铸造_C#_List_Inheritance_Casting - Fatal编程技术网

C# C使用“as”进行铸造

C# C使用“as”进行铸造,c#,list,inheritance,casting,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 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);
        }
    }
但是,当将a转换为Class1时,o总是空的。有什么问题吗?

问题是a不是Class1对象。这就是全部。 再次仔细阅读您的代码-为什么您认为基类对象可以强制转换为从它派生的类?

因为根据您的代码,a是基类:

...
 b.Add(new BaseClass());
 b.Add(new BaseClass());
 b.Add(new BaseClass());
...
并且不能将基类强制转换为子类,必须将基类强制转换为子类

例如:

  ...

    b.Add(new Class1());
    b.Add(new Class1());
   ...   
在这之后就是正确的:

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

因为你要把你的基础课变成超级课。 这就像告诉编译器,一个人总是软件开发人员,应该是相反的。所以,软件开发人员总是一个人,会计也是一个人

因此,, 基类是对人的; 第一类是软件开发者; 第二类是会计

因此,您应该将一个软件开发人员/Class1或会计师/Class2的实例添加到人员列表中,这是基本类列表


然后将BassClass标记为抽象类。

所有的类都是基类,但并非所有的基类都是ClassAs,您只是在b中添加BaseClass,而不是Class1。每只狗都是动物,但并非所有的动物都是狗。因为它不会将一个类转换为另一个类,所以它只在它是该类型的实例时才赋值