C# 具有泛型约束的泛型类型
我有以下几种:C# 具有泛型约束的泛型类型,c#,generics,C#,Generics,我有以下几种: public interface IContainer<in TKey, out TValue> { TValue Resolve(TKey key); } public interface IBuilder<out TContainer, in TKey, out TValue> where TContainer : IContainer<TKey, TValue> { TContainer Build(); } pub
public interface IContainer<in TKey, out TValue>
{
TValue Resolve(TKey key);
}
public interface IBuilder<out TContainer, in TKey, out TValue> where
TContainer : IContainer<TKey, TValue>
{
TContainer Build();
}
public interface IRegister<in TBuilder, TKey, TValue> where TBuilder :
IBuilder<IContainer<TKey, TValue>, TKey, TValue>
{
void Register(TBuilder builder);
}
public interface IServiceMessageHandlerTypeContainer<TService, in
TServiceMessageHandler>
: IContainer<TServiceMessageHandler, ECommand>
where TServiceMessageHandler : class, IMessageHandler<TService>
{
}
public interface IServiceMessageHandlerTypeContainerBuilder<TService, in
TServiceMessageHandler, out TServiceMessageHandlerTypeContainer>
: IBuilder<TServiceMessageHandlerTypeContainer, TServiceMessageHandler,
ECommand>
where TServiceMessageHandler : class, IMessageHandler<TService>
where TServiceMessageHandlerTypeContainer :
IServiceMessageHandlerTypeContainer<TService, TServiceMessageHandler>
{
void Register<TServiceMessageHandlerType>(ECommand command)
where TServiceMessageHandlerType : TServiceMessageHandler;
}
public interface IServiceMessageHandlerTypeRegister<
TService,
TServiceMessageHandler,
TServiceMessageHandlerTypeContainer,
in TServiceMessageHandlerTypeContainerBuilder>
: IRegister<TServiceMessageHandlerTypeContainerBuilder,
TServiceMessageHandler, ECommand>
where TServiceMessageHandler : class, IMessageHandler<TService>
where TServiceMessageHandlerTypeContainer
: IServiceMessageHandlerTypeContainer<TService, TServiceMessageHandler>
where TServiceMessageHandlerTypeContainerBuilder
: IServiceMessageHandlerTypeContainerBuilder<TService,
TServiceMessageHandler, TServiceMessageHandlerTypeContainer>
{
}
公共接口IContainer
{
t值解析(TKey);
}
公共接口IBuilder在哪里
t容器:i容器
{
t容器构建();
}
公共接口IRegister,其中TBuilder:
伊布尔德
{
无效登记簿(TBuilder-builder);
}
公共接口IServiceMessageHandlerTypeContainer
:i容器
其中TServiceMessageHandler:class,IMessageHandler
{
}
公共接口IServiceMessageHandlerTypeContainerBuilder
:iBilder
其中TServiceMessageHandler:class,IMessageHandler
其中TServiceMessageHandlerTypeContainer:
IServiceMessageHandlerTypeContainer
{
无效寄存器(ECommand命令)
其中TServiceMessageHandlerType:TServiceMessageHandler;
}
公共接口IServiceMessageHandlerTypeRegister<
TService,
TServiceMessageHandler,
TServiceMessageHandlerTypeContainer,
在TServiceMessageHandlerTypeContainerBuilder中>
:i注册
其中TServiceMessageHandler:class,IMessageHandler
其中TServiceMessageHandlerTypeContainer
:IServiceMessageHandlerTypeContainer
其中TServiceMessageHandlerTypeContainerBuilder
:IServiceMessageHandlerTypeContainerBuilder
{
}
我真的无法得到,为什么TServiceMessageHandlerTypeContainerBuilder的约束在这里不好
原因IServiceMessageHandlerTypeContainerBuilder
这是伊布尔德吗
和IServiceMessageHandlerTypeContainer
这是我的容器吗
你知道这里会出什么问题吗
如果我添加contain:
其中TServiceMessageHandlerTypeContainerBuilder
:IServiceMessageHandlerTypeContainerBuilder,
IBuilder、TServiceMessageHandler、ECommand>
它起作用了
但这并不是我需要的
编辑:
编译时错误为:
错误CS0314类型“TServiceMessageHandlerTypeContainerBuilder”不能用作泛型类型或方法“IRegister”中的类型参数“TBuilder”。没有从“TServiceMessageHandlerTypeContainerBuilder”到“Patterns.DependencyInjection.Builder.IBuilder、TServiceMessageHandler、DataTransmissionServices.Enums.ECommand>”的装箱转换或类型参数转换
某些东西与协方差和逆方差有关吗?不,它与协方差或逆方差无关。它与通用参数的约束有关 TServiceMessageHandlerTypeContainerBuilder的构造将转到
i文件夹,其中t容器:i容器
但是当您从继承IServiceMessageHandlerTypeRegister时
IRegister<TServiceMessageHandlerTypeContainerBuilder,TServiceMessageHandler, ECommand>
i注册表
约束转到IBuilder、TKey、TValue>。
因为IBuilder、TKey、TValue>无法转换为IBuilder,所以您会遇到编译错误。您所说的“不好”是什么意思?您的意思是这会导致编译时错误吗?如果是,请在问题中包含错误。另外,如果你能减少问题中涉及的类型的数量,那肯定会有助于让问题更清楚。我想我不能减少类型的数量,因为这里的所有类型都可能是错误的原因