C# 如何迭代通用子项的共同父项 class 的字典?
C# How to iterate over a Dictionary of common parent class for generic children?
我有这种情况:
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){...}
}
我的问题在这里:
如果 Dog 扩展了 animal 为什么词典不将 Dog 识别为 Animal?
您是否有想法允许传递子字典 class 并迭代它(不使用 (string,object) 的处理字典)?
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**
}
非常感谢。
编译器优化能力与您同在。
Dictionary<string,Animal>
的问题在于它允许您添加。如果你可以在狗的字典中添加一个 "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 one or this one。
我有这种情况:
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){...}
}
我的问题在这里:
如果 Dog 扩展了 animal 为什么词典不将 Dog 识别为 Animal?
您是否有想法允许传递子字典 class 并迭代它(不使用 (string,object) 的处理字典)?
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**
}
非常感谢。 编译器优化能力与您同在。
Dictionary<string,Animal>
的问题在于它允许您添加。如果你可以在狗的字典中添加一个 "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 one or this one。