【问题标题】:C# Casting using 'as'C# 使用'as'进行强制转换
【发布时间】:2014-03-07 16:37:18
【问题描述】:

我有以下代码:

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 始终为空。有什么问题?

【问题讨论】:

  • 您只是将BaseClass 添加到b,而没有添加Class1。每只狗都是动物,但并非所有动物都是狗。
  • 由于不会将一个类转换为另一个类,它只会在它是该类型的实例时分配它

标签: c# list inheritance casting


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    因为根据您的代码,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.      
    }
    

    【讨论】:

    • 所有 Class1 都是 BaseClass,但并非所有 BaseClass 都是 Class1
    【解决方案3】:

    因为您将基类转换为超类。 这就像告诉编译器“人”始终是“软件开发人员”,应该反过来。因此,“软件开发人员”始终是“人”,“会计师”也是“人”。

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

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

    然后将您的 BassClass 标记为抽象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2011-01-27
      • 1970-01-01
      相关资源
      最近更新 更多