接口继承和通用接口强制显式转换?

时间:2011-06-17 18:53:20

标签: c# generics inheritance interface type-inference

我有一个更复杂的问题,但我把它归结为以下简单的例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            IFactory<IProduct> factory = new Factory();
        }
    }

    class Factory : IFactory<Product>
    {

    }

    class Product : IProduct
    {

    }

    interface IFactory<T> where T : IProduct
    {

    }

    interface IProduct
    {

    }
}

一切都很好,花花公子...除了我得到这个错误。

错误1无法将类型Sandbox.Factory隐式转换为Sandbox.IFactory<Sandbox.IProduct>。存在显式转换(您是否缺少演员表?)c:\ ~~ \ Program.cs 12 42 Sandbox

有谁愿意提供有关为何情况的见解?我确信Jon Skeet或Eric Lippert可以在心跳中解释为什么会这样,但是必须有一个人不仅理解为什么这不能被推断,而是可以解释如何最好地解决这种情况。

跟进问题here

1 个答案:

答案 0 :(得分:3)

这是因为FactoryIFactory< Product>,而您分配给它的是IFactory< IProduct>,而IFactory不是covariant,您不能将子类型的泛型强制转换为超类型的泛型。

尝试制作IFactory< out T>,以便进行以下作业。

修改

@Firoso,在您的工厂界面中,您正在尝试创建一个列表,您可以在其中写入。如果您的界面是协变的,则无法写入任何内容,因为以下内容:

List<object> list = new List<string>(); //This is not possible by the way
list.Add(new {}); //Will fail here because the underlying type is List<string> 

你应该忽略你的情况下的协方差,而只是创建分配给IFactory<Product>而不是改变工厂来继承IFactory<IProduct>,我推荐后者,但这取决于你