无法将类型“B”隐式转换为“B

本文关键字:IA 转换 类型 | 更新日期: 2023-09-27 17:55:11

我正在做一件非常简单的事情,但没有工作。我有

public class A : IA
{
}
public interface IA
{
}
public class B<T> where T : IA
{
}

现在我正在使用 Autofac 来注册这个,

        builder.Register<B<IA>>(b =>
        {
            return new B<A>();
        });

但是我收到此错误,

Cannot implicitly convert type 'B<A>' to 'B<IA>'?
Cannot convert lambda expression to delegate type 'System.Func<Autofac.IComponentContext,B<IA>>' because some of the return types in the block are not implicitly convertible to the delegate return type

无法将类型“B<A>”隐式转换为“B<IA>”

给定您正在使用的类,看起来您只想允许编译器Register确定泛型参数:

builder.Register(b => new B<A>());

B<A>作为依赖项的类,然后获取正确的B<A>实例。将B<IA>作为依赖项是没有意义的,泛型不是这样工作的。如果这是您打算执行的操作,则需要改为为 B<T> 创建一个接口,这样就不需要指定任何泛型类型。

所以:

public interface IB
{
}
public class B<T> : IB where T : IA
{
}

然后,任何需要将依赖项带到B<T>的类实际上都会将依赖项带到IB

更新

autofac中的OpenGenerics也可能有所帮助,这取决于你打算如何使用这些类。看看他们网站上的示例,它将允许很好地控制通过RegisterGeneric()方法注册的泛型类型。

我认为您错过了协方差和逆变功能。

   public class A : IA
   {
   }
   public interface IA<out T>
   {
   }
   public class B where T : IA
   {
   }

相关链接:

  • 使用泛型 MSDN 创建变体
  • 协方差和逆变的区别