无法检索添加到List在c#

本文关键字:object List 检索 添加 | 更新日期: 2023-09-27 18:09:00

我很难理解c#中的继承。假设我有两个这样的类

public class Base
{
    public void print()
    {
        Console.WriteLine("this is a BASE method");
    }
}
public class Derived : Base
{
    public void print()
    {
        Console.WriteLine("this is a DERIVED method");
    }
}

现在,当我创建一个List<object>,并尝试添加两个对象像这样尝试访问方法,我不能这样做

class Program
{
    static void Main()
    {
        List<object> lists = new List<object>();
        lists.Add(new Base());
        lists.Add(new Derived());
        foreach (var a in lists)
        {
        }
        Console.ReadLine();
    }
}

但是当我添加两个整数值并尝试访问它时,我能够访问它,这是怎么可能的?

static void Main()
{
    List<object> lists = new List<object>();
    lists.Add(4);
    lists.Add(5);
    foreach (var a in lists)
    {
       Console.WriteLine(a);
    }
    Console.ReadLine();
}

我如何能够得到整数值,甚至不转换它,我错过了一些关键的概念在这里,请帮助我理解

更新1

让我再解释一遍我的问题,当我想从添加的列表中调用一个方法时,我必须将其转换为相应的类型,就像这样

A a = lists[0] as A;
B b = lists[1] as B;
C c = lists[2] as C;    
a.print();
b.print();
c.print();

但是当我像这样向列表中添加int时

List<object> lists = new List<object>();
lists.Add(4);
lists.Add(5);
foreach (var a in lists)
{
Console.WriteLine(a);
}

为什么不需要先把它转换成int然后再输出呢

无法检索添加到List<object>在c#

您缺少的关键概念是.ToString()int中被覆盖,这使得它打印数字而不是System.Int32。您也可以通过简单地在函数中添加一个public override string ToString()来使您的代码做到这一点。

public class Base
{
    public override string ToString()
    {
        return "this is a BASE method";
    }
}
public class Derived : Base
{
    public override string ToString()
    {
        return "this is a DERIVED method";
    }
}
class Program
{
    static void Main()
    {
        List<object> lists = new List<object>();
        lists.Add(new Base());
        lists.Add(new Derived());
        foreach (var a in lists)
        {
            Console.WriteLine(a);
        }
        Console.ReadLine();
    }
}

要真正能够调用print(),您需要将列表类型设置为Base而不是object,并且您需要将打印函数标记为基础的virtual和派生的override

public class Base
{
    public virtual void print()
    {
        Console.WriteLine("this is a BASE method");
    }
}
public class Derived : Base
{
    public override void print()
    {
        Console.WriteLine("this is a DERIVED method");
    }
}
static void Main()
{
    List<Base> lists = new List<Base>();
    lists.Add(new Base());
    lists.Add(new Derived());
    foreach (var a in lists)
    {
        a.print();
    }
    Console.ReadLine();
}

多态性允许您在使用基类类型时调用子类的正确方法。然而,对它的一个限制是,它被设置为的类的类型也必须包含该方法。

您正在创建object的列表,Object类没有您试图在其内部调用的方法,因此您不能调用该方法。要纠正这个问题,您应该将列表更改为具有该方法的类型(在本例中为Base)。

当传递一般object类型时,Console.WriteLine使用ToString -该方法在任何类中都可用。

你可以在你的情况下重写它:

public class Base
{
    public override string ToString()
    {
        return "this is a BASE method";
    }
}
public class Derived : Base
{
    public override string ToString()
    {
        return "this is a DERIVED method";
    }
}

那么你可以这样使用:

foreach (var a in lists)
{
    Console.WriteLine(a);
}

Integer已经重写了这个方法-这就是为什么它工作。

相关文章: