首页 > 解决方案 > 使用带有约束的泛型时无法隐式转换类型

问题描述

我正在尝试为 AutoMapper 创建一个自定义类型转换器,我的问题是“无法隐式转换类型

这是我的转换器代码:

public class StatusConverter<TValue> : ITypeConverter<string, Wrapper<TValue>> where TValue : Status
{
    public Wrapper<TValue> Convert(string source, Wrapper<TValue> destination, ResolutionContext context)
    {
        return Status.Create(source);
    }
}

该错误在线发生return Status.Create(source);,它说无法从 转换Wrapper<Status>Wrapper<TValue>

我在这里上传了与此相关的所有其他类: https ://dotnetfiddle.net/iSr94S

但我的问题是:为什么我会收到这个错误?我在方法中设置了一个约束where TValue : Status,所以TValue会是类型Status,为什么抱怨类型?

谢谢

标签: c#genericsinterfaceautomapper

解决方案


正如我在评论中所说,这种行为的原因是 C# 中的类不支持方差,即不支持Wrapper<SomeStatusChild>Wrapper<Status>例如,在此处解释)。如果你没有Status继承人,你可以这样做:

public class StatusConverter : ITypeConverter<string, Wrapper<Status>>
{
    public Wrapper<Status> Convert(string source, Wrapper<Status> destination, ResolutionContext context)
    {
        return Status.Create(source);
    }
}

推荐阅读