代码之家  ›  专栏  ›  技术社区  ›  flytzen

如何将子类字典视为基类字典

  •  0
  • flytzen  · 技术社区  · 14 年前

    在C中,有许多对象都继承自同一个基类。
    我还有许多字典,每个子类一个。
    我要做的是把所有的字典都加在一本上 所以我可以循环浏览它们并做一些工作(比如比较列表等)。

    综上所述

    Dictionary<string, Child> childObjects = new Dictionary<string, Child>();
    List<Dictionary<string, Parent>> listOfDictionaries = new List<Dictionary<string, Parent>>();
    listOfDictionaries.Add(childObjects);
    

    我本以为既然孩子是从父母那里继承的,这应该是可行的,但它不会编译。很明显,我对继承和仿制药不了解。)

    完整的代码示例

    class Program
    {
        static void Main(string[] args)
        {
            //Creating a Dictionary with a child object in it
            Dictionary<string, Child> childObjects = new Dictionary<string, Child>();
            var child = new Child();
            childObjects.Add(child.id, child);
    
            //Creating a "parent" Dictionary with a parent and a child object in it
            Dictionary<string, Parent> parentObjects = new Dictionary<string, Parent>();
            parentObjects.Add(child.id, child);
            var parent = new Parent();
            parentObjects.Add(parent.id, parent);
    
            //Adding both dictionaries to a general list
            List<Dictionary<string, Parent>> listOfDictionaries = new List<Dictionary<string, Parent>>();
    
            listOfDictionaries.Add(childObjects);  //This line won't compile
    
            listOfDictionaries.Add(parentObjects);
    
    
        }
    }
    
    class Parent
    {
        public string id { get; set; }
        public Parent()
        {
            this.id = "1";
        }
    }
    
    class Child : Parent
    {
        public Child()
        {
            this.id = "2";
        }
    
    }
    

    有什么办法可以达到这个目的吗?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Jon Skeet    14 年前

    你不能安全地这么做。想象一下你这样做了:

    listOfDictionaries[0]["foo"] = new Parent();
    

    好吧-但这意味着 childObjects 包含的值不是 Child !

    C 4引入了有限的一般方差 安全的 -因此可以转换类型的引用 IEnumerable<Banana> IEnumerable<Fruit> 例如-但是你想在这里做的事情不安全,所以仍然是不允许的。

    如果你能告诉我们更多关于更大背景的事情——你正在努力实现的目标——我们也许能提供更多帮助。你能举例说明你以后想用这个清单做什么吗?