C#为什么我不能添加一个类型到子类的哈希集到一个类型为其超类的哈希集

前端之家收集整理的这篇文章主要介绍了C#为什么我不能添加一个类型到子类的哈希集到一个类型为其超类的哈希集前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么在下面的代码中得到一个编译错误(请参阅注释行)?
public void Test()
    {
        HashSet<HashSet<Animal>> setWithSets = new HashSet<HashSet<Animal>>();
        HashSet<Cat> cats = new HashSet<Cat>();
        setWithSets.Add(cats); // Compile error
    }

    private class Animal { }

    private class Cat : Animal { }

VS2012给了我两个错误,第一个是重要的一个:

>错误2参数1:无法从“System.Collections.Generic.HashSet&Expenses.Tests.TestDb.SetTest.Cat”转换到’System.Collections.Generic.HashSet&Expenses.Tests.TestDb.SetTest.Animal>’
>错误1最好的重载方法匹配’System.Collections.Generic.HashSet< System.Collections.Generic.HashSet&Expenses.Tests.TestDb.SetTest.Animal> .Add(System.Collections.Generic.HashSet)’有一些无效的参数

我的问题是:为什么我不能在“setWithSets”中添加“cats”?

解决方法

为了更好地理解为什么不允许这样做,请考虑以下程序.

行setOfSets.First().Add(new Dog());是编译器可以接受的,因为动物的集合肯定可以容纳一个Dog的实例.问题是集合中第一集合的动物是Cat实例的集合,而Dog不扩展Cat.

class Animal { }
class Cat : Animal { }
class Dog : Animal { }

class Program {
    static void Main(string[] args) {

        // This is a collection of collections of animals.
        HashSet<HashSet<Animal>> setOfSets = new HashSet<HashSet<Animal>>();

        // Here,we add a collection of cats to that collection.
        HashSet<Cat> cats = new HashSet<Cat>();
        setOfSets.Add(cats);

        // And here,we add a dog to the collection of cats. Sorry,kitty!
        setOfSets.First().Add(new Dog());
    }
}

猜你在找的C#相关文章