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动物)
{
//做点什么
}
}
如果您想了解这背后的理论,请参阅关于协方差和逆变换的答案之一,如或。非常感谢,我需要知道概念的名称。非常感谢,我需要知道概念的名称。