C#如何遍历普通子类的公共父类的字典?

问题描述 投票:0回答:1

我有这种情况:

class Animal 
{
  int size;
} 

class Dog : Animal 
{
 string Name;
}

class Cat : Animal 
{
 string Alias;
}

public void Check( Dictionary<string,Animal> animals ) 
{
 foreach(var pet in animals){...}
}

我的问题在这里:

如果狗延伸动物,为什么词典不承认狗是动物?

你有想法允许传递子类的字典并迭代它(whitout使用处理字典(字符串,对象))?

public void MySituation()

    {
        Dictionary<string,Animal> dogs = new Dictionary<string,Dog>();
        ** ERROR 01**

        Dictionary<string,Cat> cats = new Dictionary<string,Cat>();
        Check(cats);
        ** ERROR 02**
    }

非常感谢。编译器优化能力与您同在。

c# covariance contravariance
1个回答
1
投票

Dictionary<string,Animal>的问题在于它允许你添加。如果你可以在狗的字典中添加一个“动物”,你很容易就会在那里找到一只猫,然后一切都会破裂。因此编译器不允许您将任何其他类型的字典视为相同。

您需要做的是使用只读的接口,例如IEnumerable

public void Check( IEnumerable<KeyValuePair<string,Animal>> animals ) 
{
     foreach(var pair in animals)
     {
         var animal = pair.Value;
         //Do something
     }
}

另一种选择是使您的方法通用:

public void Check<T>( Dictionary<string,T>> animals ) where T : animal
{
     foreach(T animal in animals)
     {
         //Do something
     }
}

如果您想了解这背后的理论,请参阅有关协方差和逆变的答案之一,如this onethis one

© www.soinside.com 2019 - 2024. All rights reserved.