我做的很简单,但没有工作。我有,
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
答案 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
{
}
相关链接: