C#多态和泛型类型匹配错误

din*_*igo 0 c# generics

我有一个类似的结构

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)

该怎么做?

D S*_*ley 6

这是一个经典的协方差问题.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)