无法将类型“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
给定您正在使用的类,看起来您只想允许编译器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 创建变体
- 协方差和逆变的区别