我有一个类似的结构
enum AnimalType {dog, cat}
class Animal{}
class Dog : Animal {}
class Cat : Animal {}
class Vet<T> where T : Animal {}
class DogVet : Vet<Dog> {}
class CatVet : Vet<Cat> {}
Run Code Online (Sandbox Code Playgroud)
为什么我不能这样做呢?
...
Vet<Animal> myVet = new DogVet();
...
Run Code Online (Sandbox Code Playgroud)
为什么我不能添加这样的元素Dictionary?
...
Dictionary<AnimalType, Vet<Animal>> _vetList = new Dictionary<AnimalType, Vet<Animal>>();
_vetList.Add(AnimalType.dog, new DogVet());
...
Run Code Online (Sandbox Code Playgroud)
该怎么做?
这是一个经典的协方差问题.A Vet<Dog>不是Vet<Animal>.如果继续这个比喻,一个Vet<Dog>可以只把狗.你不能把它用作可以治疗任何动物的兽医.
我们假设你有一个Treat功能:
public void Treat<T>(T patient) {}
Run Code Online (Sandbox Code Playgroud)
现在如果a Vet<Dog>是a Vet<Animal>那么这将是可能的:
Vet<Animal> dogVet = new Vet<Dog>();
dogVet.Treat(new Cat()); // but I can only treat dogs!!!
Run Code Online (Sandbox Code Playgroud)