我正在尝试分配一个继承自派生类的类,但 C# 编译器不允许。
这是我想要实现的示例设置。
using System;
namespace ConsoleApp
{
interface IInterfaceA
{
}
interface IInterfaceB
{
}
class TypeA : IInterfaceA
{
}
class TypeB : IInterfaceB
{
}
interface IMapper<in TIn, out TOut>
where TIn : IInterfaceA
where TOut :IInterfaceB
{
TOut MapAToB(TIn input);
}
class AToBMapper : IMapper<TypeA, TypeB>
{
public TypeB MapAToB(TypeA input) => throw new NotImplementedException();
}
class Program
{
static void Main(string[] args)
{
IMapper<IInterfaceA, IInterfaceB> test = new AToBMapper();
}
}
}
一切正常,直到我到达下一行。
IMapper<IInterfaceA, IInterfaceB> test = new AToBMapper();
在其中,C# 编译器因错误而失败,告诉我
Cannot implicitly convert type 'ConsoleApp.AToBMapper' to 'ConsoleApp.IMapper<ConsoleApp.IInterfaceA, ConsoleApp.IInterfaceB>'. An explicit conversion exists (are you missing a cast?)
但是,我似乎无法理解为什么。
IMapper
接口(interface)的泛型参数分别标记为协变和逆变,我的AtoBMapper
继承自ITypeMapper
。
如果 TypeA
是一个 IInterfaceA
而 TypeB
是一个 IInterfaceB ,这难道不可能吗?
最佳答案
如果您要分配给 IMapper(TypeA,TypeB),或者如果您将 AToBMapper 实现为 IMapper(IInterfaceA, IInterfaceB),它会完美运行。
您正在做的是在具体类实现(TypeA、TypeB)上实现映射器,而不是在这些类的通用接口(interface)上。因此,在接口(interface)允许的情况下,您的实现可能会使用更具体的定义来进行映射。
使用你的实现,你可以做一些事情,比如定义一个 TypeC 类,实现接口(interface) IInterfaceA。此类将填充接口(interface) IInterfaceA 并允许在 IMapper(IInterfaceA, IInterfaceB) 上使用。但实际实现需要 TypeA 类,而不是 TypeC 类。
关于c# - 无法将派生类分配给其父通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57432157/