繁体   English   中英

C#如何为通用子代迭代常见父类的词典?

[英]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扩展了动物,那么大主教为什么不承认Dog是动物?

您是否有想法允许传递子类的Dictionary并对其进行迭代(使用(string,object)的对待Dictionary来进行淘汰)?

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>的问题在于它允许您添加。 如果您可以在“狗”词典中添加“动物”,那么您很容易在其中养猫,那么地狱就会崩溃。 因此,编译器不允许您将任何其他类型的字典视为相同。

您需要做的是使用只读接口,例如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
     }
}

如果您想了解其背后的理论,请参阅有关协方差和逆方差的答案之一 ,例如“ 一个”或“ 这个”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM