c# - C#如何迭代通用子类的公共父类字典?
问题描述
我有这种情况:
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){...}
}
我的问题在这里:
如果狗扩展了动物,为什么字典不承认狗是动物?
您是否有允许传递子类字典并对其进行迭代的想法(不使用 (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>
在于它允许您添加。如果您可以将“动物”添加到狗字典中,那么您很容易在其中找到一只猫,然后一切都会崩溃。因此编译器不会允许您将任何其他类型的字典视为相同。
您需要做的是使用只读接口,例如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
}
}
推荐阅读
- uri - 什么定义了 URI 端口的最大整数值?
- java - 在没有测试方法覆盖的情况下为子类运行 JUnit 测试
- java - .jar 可执行文件,保持“小窗口”
- c# - 如何使用 NAudio 将声音文件加载到内存中并稍后使用?
- node.js - Google Node.js SDK unicode 上的操作
- jenkins - 将 Jenkins 内部版本号传递给 Protractor for SauceLabs
- python - 在 virtualenv 中运行 jupyter notebook(有权限问题)
- button - Vue使用按钮更改输入字段中的文本
- sql-server - SQL Server Management Studio 无法识别 .bak 文件
- r - 使用R中的stringi提取字符串中某些字符之后的多个子字符串