我试图弄清楚为什么编译器抱怨这个(我认为是一个简单的)继承场景:
鉴于这个抽象类......
public class AbstractAnimalValidator<TAnimal> : AbstractValidator<TAnimal>
where TAnimal: Animal<IFoo, IBar>, new()
{
}
然后我尝试创建这个具体的类......
public class CatValidator : AbstractAnimalValidator<Cat>{ }
我收到此错误...
好的,那么Cat
是什么?
public abstract class Animal<TFoo, TBar>
where TFoo : IFoo
where TBar : IBar { }
public class Cat : Animal<RedFoo, CleanBar> { }
我只是不明白:/猫是那两种......
现在this is the FULL REPO on .NET Fiddle显示此实例。
我想我也要求的是
1. 为什么我的代码不起作用? IE浏览器。我的大脑说应该有用,但编译器说:given this scenario XXX .. I wouldn't know what to do ...
2.如何解决这个问题,以便我可以学习。
答案 0 :(得分:1)
这是因为Cat
是Animal<RedFoo, CleanBar>
的子类,AbstractAnimalValidator
期望某个子类型为Animal<IFoo, IBar>
,但Animal<RedFoo, CleanBar>
不是< / em> Animal<IFoo, IBar>
的子类型,因此Cat
也不是子类型。
请注意,在这个术语中,子类型是一个更通用的术语,然后是子类。如果B
继承A
,则B
是A
的子类,如果B
类型,则A
是B
的子类型可以将对象分配给A
类型变量。
要解决此问题,请将TFoo
和TBar
类型参数协变。这仅适用于C#中的接口,因此您需要引入一个新接口:
public interface IAnimal<out TFoo, out TBar>
where TFoo : IFoo
where TBar : IBar { }
并像这样使用它:
public class AbstractAnimalValidator<TAnimal>
where TAnimal : IAnimal<IFoo, IBar>, new()
{
}
public abstract class Animal<TFoo, TBar> : IAnimal<TFoo, TBar>
where TFoo : IFoo
where TBar : IBar { }
这种方式Cat
成为IAnimal<IFoo, IBar>
的子类型,因为RedFoo
是IFoo
的子类,CleanBar
是IBar
的子类