无法隐式转换类型&#39; B <a>&#39; to &#39;B<ia>&#39;?</ia></a>

时间:2014-03-30 08:20:23

标签: c# autofac c#-5.0

我做的很简单,但没有工作。我有,

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

2 个答案:

答案 0 :(得分:1)

鉴于您正在使用的类,看起来您只想允许编译器确定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 也可能有所帮助,具体取决于您打算如何使用这些类。看一下the example on their site,它可以很好地控制通过RegisterGeneric()方法注册的泛型类型。

答案 1 :(得分:1)

我认为您错过了该功能Covariance and Contravariance

   public class A : IA
   {
   }

   public interface IA<out T>
   {
   }

   public class B where T : IA
   {
   }

相关链接: