问题描述
|
我试图使以下文字尽可能准确,就像我从视频培训中听到的那样
http://shop.tekpub.com/products/csharp4
interface IFoo<in T>
{
void TakeAnInstanceOfT(T instance);
}
class Program
{
static void Main(string[] args)
{
IFoo<Fruit> fruit = null;
IFoo<Apple> apple = fruit; // <<< The following description was used
// <<< to explain this line.
// Apple is fruit.
// That\'s ok. Because anytime when fruit is expected to be
// passed in,is perfectly happy
// if you actually pass-in apple
}
}
问题>根据我的理解,下面陈述的原因
IFoo<Apple> apple = fruit;
正确是因为接口IFoo接受了协方差参数。换句话说,它允许您传入T的父类的实例。同时,视频解释告诉我完全相反的事情。
我希望作者说以下内容(这种情况下我应该错了:)
IFoo<Apple>
,只要期望有苹果,您就可以通过。
解决方法
不确定视频,但这是解释。假设您有以下实现:
public class FruitImpl : IFoo<Fruit>
{
public void TakeAnInstanceOfT(Fruit instance)
{
}
}
public class AppleImpl : IFoo<Apple>
{
public void TakeAnInstanceOfT(Apple instance)
{
}
}
现在,假设您这样做:
IFoo<Fruit> fruit = new FruitImpl();
IFoo<Apple> apple = fruit;
如果我们再调用apple.TakeAnInstanceOfT(new Apple())
(您必须传入Apple的实例,因为它现在已被强类型化为IFoo<Apple>
),那么将调用FruitImpl
中的方法(请记住,苹果指向FruitImpl
的实例),并且您\'将Apple
的实例传递给接受Fruit
的方法,这是完全合法的。说得通?