我有一个更复杂的问题,但我把它归结为以下简单的例子:
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
答案 0 :(得分:3)
这是因为Factory
是IFactory< 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>
,我推荐后者,但这取决于你