【发布时间】:2018-06-21 08:13:26
【问题描述】:
我有一些与此等效的代码(尽管这是一种简化):
namespace AnimalHospital
{
public class Animal { }
public class Dog : Animal { }
public class Cat : Animal { }
public interface Vet<T> where T : Animal
{
void takeCareOf(T animal);
}
public abstract class SpecializedDogVet<T> : Vet<T> where T : Dog
{
public abstract void takeCareOf(T dog);
}
public abstract class SpecializedCatVet<T> : Vet<T> where T : Cat
{
public abstract void takeCareOf(T cat);
}
public class AnimalHospital
{
public IList<SpecializedCatVet<Cat>> CatVets = new List<SpecializedCatVet<Cat>>();
public IList<SpecializedDogVet<Dog>> DogVets = new List<SpecializedDogVet<Dog>>();
private void treatSickAnimal(IEnumerable<Vet<Animal>> vets, Animal patient)
{
foreach(var vet in vets)
{
vet.takeCareOf(patient);
}
}
public void treatSickCat(Cat cat)
{
treatSickAnimal(CatVets, cat);
}
public void treatSickDog(Dog dog)
{
treatSickAnimal(DogVets, dog);
}
}
}
我收到一个错误,告诉我转换来自:
IList<SpecializedCatVet<Cat>> 到 IEnumerable<Vet<Animal>> 是不可能的。怎么会这样?在此之前它们是非泛型的,而且我还有一些其他问题,因为我无法覆盖 vet 接口 takeCareOf 方法。我曾预料到,由于 Animal 的 IEnumerable 可以很容易地用 Dog 列表实例化,因此解析泛型集合也是如此,只要它们的类型参数是所需类型的派生词。但事实并非如此,我似乎无法弄清楚为什么或如何正确地做到这一点。
感谢阅读。
更新:我接受 JLRishe 的回答,非常有意义。非常感谢。
【问题讨论】:
-
查看
IEnumerable是否与您的问题相关联的一种简单方法是在调用treatSickAnimal(treatSickAnimal(DogVets.AsEnumerable*(), dog)) 之前使用System.Linq中的.AsEnumerable()。没有链接?将其放入您的示例中:) -
不,我从一开始就知道集合类型不是问题,而是类型参数,我只是不明白为什么:)