你如何将字典<int, child> 转换为字典<int, parent>?

gre*_*bit 10 c#

假设我有:

public class Animal
{
    virtual public void Attack() {};
}
public class Lion : Animal
{
    public override void Attack() { base.Attack(); }
}
public class Boar : Animal
{
    public override void Attack() { base.Attack(); }
}
Run Code Online (Sandbox Code Playgroud)

以及这两种动物的容器:

Dictionary<int, Lion> lions;
Dictionary<int, Boar> boars;
Run Code Online (Sandbox Code Playgroud)

有没有办法投射“狮子”和“野猪”,以便我可以将它们传递给这样的函数?

void IterateTable(Dictionary<int, Animal> dictionary)
{
    foreach(var entry in dictionary)
        entry.Value.Attack();
}
Run Code Online (Sandbox Code Playgroud)

Den*_*s_E 7

也许是这样的?

void IterateTable<T>(Dictionary<int, T> dictionary)
    where T : Animal
{
    foreach(var entry in dictionary)
        entry.Value.Attack();
}
Run Code Online (Sandbox Code Playgroud)


Eri*_* J. 5

您的代码按编写的方式工作。当字典值中的 Animal 调用了它的 Attack() 方法时,它会调用适当的、特定于动物的方法。这称为协方差。您可以为字典提供比其签名所需的更具体的类型。

您可以按如下方式修改您的代码以查看:

void Main()
{
    Dictionary<int, Animal> dictionary = new Dictionary<int, Animal>()
    {
        [1] = new Lion(),
        [2] = new Boar()
    };

    IterateTable(dictionary);
}

public class Animal
{
    virtual public void Attack() { Console.WriteLine("Default animal attack"); }
}
public class Lion : Animal
{
    public override void Attack() { Console.WriteLine("Lion attack"); }
}
public class Boar : Animal
{
    public override void Attack() { Console.WriteLine("Boar attack"); }
}

void IterateTable(Dictionary<int, Animal> dictionary)
{
    foreach (var entry in dictionary)
        entry.Value.Attack();
}
Run Code Online (Sandbox Code Playgroud)

输出:

狮子攻击

野猪袭击