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

标签 c# inheritance interface covariance contravariance

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

相关文章:

c# - Mvvm wpf : update value binding before leaving focus of input element

c# - 如何订阅改变DependencyProperty?

c# - 不同固件中的协方差导致代码中断?

pointers - 指向结构的 Nil 指针不深等于 nil?

c# - 从 jQuery 调用 ASMX

c# - 使用 XmlSerializer 反序列化嵌套列表

java - Java中的继承和静态成员

java - 这里的继承是怎么回事?

c# - 了解 C# 接口(interface)

java - Java接口(interface)中的重载方法