C#如何迭代泛型子类的公共父类字典?

C#如何迭代泛型子类的公共父类字典?,c#,covariance,contravariance,C#,Covariance,Contravariance,我有这样的情况: 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){...} } 类动物 { 整数大小; } 狗类:动物 { 字符串名;

我有这样的情况:

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){...}
}
类动物
{
整数大小;
} 
狗类:动物
{
字符串名;
}
类别猫:动物
{
字符串别名;
}
公共作废检查(字典动物)
{
foreach(动物中的宠物变量){…}
}
我的问题是:

如果狗延伸到动物身上,为什么兽医不承认狗是动物

您是否有允许传递子类的字典并对其进行迭代的想法(不使用(string,object)的treat字典)

public void MySituation()
{
字典狗=新字典();
**错误01**
字典猫=新字典();
检查(猫);
**错误02**
}
非常感谢。
编译器优化功能将与您同在。

字典的问题在于它允许您添加。如果你能在一本狗的字典里加上一个“动物”,你很容易就有一只猫在里面,然后所有的地狱都会消失。因此,编译器不允许您将任何其他类型的字典视为相同的字典

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

public void Check( IEnumerable<KeyValuePair<string,Animal>> animals ) 
{
     foreach(var pair in animals)
     {
         var animal = pair.Value;
         //Do something
     }
}
公共无效检查(IEnumerable动物)
{
foreach(动物的var对)
{
var动物=配对值;
//做点什么
}
}
另一个选项是使方法通用:

public void Check<T>( Dictionary<string,T>> animals ) where T : animal
{
     foreach(T animal in animals)
     {
         //Do something
     }
}
公共无效检查(字典>动物),其中T:animal
{
foreach(动物中的T动物)
{
//做点什么
}
}

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

字典的问题在于它允许您添加。如果你能在一本狗的字典里加上一个“动物”,你很容易就有一只猫在里面,然后所有的地狱都会消失。因此,编译器不允许您将任何其他类型的字典视为相同的字典

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

public void Check( IEnumerable<KeyValuePair<string,Animal>> animals ) 
{
     foreach(var pair in animals)
     {
         var animal = pair.Value;
         //Do something
     }
}
公共无效检查(IEnumerable动物)
{
foreach(动物的var对)
{
var动物=配对值;
//做点什么
}
}
另一个选项是使方法通用:

public void Check<T>( Dictionary<string,T>> animals ) where T : animal
{
     foreach(T animal in animals)
     {
         //Do something
     }
}
公共无效检查(字典>动物),其中T:animal
{
foreach(动物中的T动物)
{
//做点什么
}
}

如果您想了解这背后的理论,请参阅关于协方差和逆变换的答案之一,如或。

非常感谢,我需要知道概念的名称。非常感谢,我需要知道概念的名称。