【发布时间】:2018-04-04 06:24:44
【问题描述】:
我整天都在寻找合适的解决方案,我对 C# 还很陌生。 如果我是对的,想要类似于 Java 代码的东西
ArrayList<IAnimalStuff<? extends Animal>> ianimals = new ArrayList<>();
仅适用于 C#。或者当我走错路时的另一种解决方案。
详细场景: 我有一个基类(Animal)和多个子类(例如 Dog)。
class Animal
{
}
class Dog : Animal
{
}
我创建了一个所有动物的通用列表,其中包含各种不同动物的对象。
List<Animal> animals = new List<Animal>();
animals.add(new Dog()); // and so on
此外,我为从该接口派生的每种特殊动物都有一个接口和一个类。
interface IAnimalStuff<TAnimal> where TAnimal : Animal
{
void doSomething(TAnimal animal);
}
public class DogStuff : IAnimalStuff<Dog>
{
public override void doSomething(Dog animal)
{
}
}
现在我想管理一个包含 Animals 的列表和一个包含 AnimalStuff 的列表。在遍历所有动物时,我想执行另一个列表中对狗有效的所有 Animalstuff。虽然列出动物列表没有问题,但我在创建另一个列表时遇到了问题。
List<IAnimalStuff<Animals>> ianimals = new List<IAnimalStuff<Animals>>();
与第一个列表不同,我只能将对象添加到此类型的列表中
IAnimalStuff<Animals>
,但我也想做
ianimals.add(GetDogStuff()); // add object of type IAnimalStuff<Dog>
我认为这是有效的,因为 Dog 是 Animal 的子类。我认为使用上面的 Java 代码可以解决这个问题,但我没有找到 C# 的任何解决方案。还是我走错了路?
【问题讨论】:
-
不清楚你是否真的读过 c# 中的协方差?您似乎有合适的条件来查找信息,但实际上并没有在您的问题中提到它...您是否只需要链接到 docs.microsoft.com/en-us/dotnet/standard/generics/… 之类的文章,或者您是否已经尝试过但无法让它工作?
-
我也找到了你提到的那篇文章,但是没有帮到我。据我了解,我的方法应该是可行的。也许我再也见不到树木了。
-
C# 没有使用点差异,只有声明点差异。
标签: c# generics inheritance covariance