gpt4 book ai didi

c# - 无法将派生类分配给其父通用接口(interface)

转载 作者:行者123 更新时间:2023-11-30 14:44:46 24 4
gpt4 key购买 nike

我正在尝试分配一个继承自派生类的类,但 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 是一个 IInterfaceATypeB 是一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com