【发布时间】:2019-12-17 07:40:09
【问题描述】:
我正在尝试分配一个从派生类继承的类,但 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接口的泛型参数分别标记为协变和逆变,我的AtoBMapper继承自ITypeMapper。
考虑到TypeA 是IInterfaceA 和TypeB 是IInterfaceB ?,这不应该是可能的吗
【问题讨论】:
标签: c# inheritance interface covariance contravariance