有关tekpub Mastering C#4.0 series 2的问题

问题描述

| 我试图使以下文字尽可能准确,就像我从视频培训中听到的那样 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
的方法,这是完全合法的。说得通?