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,所以您会遇到编译错误。

您所说的“不好”是什么意思?您的意思是这会导致编译时错误吗?如果是,请在问题中包含错误。另外,如果你能减少问题中涉及的类型的数量,那肯定会有助于让问题更清楚。我想我不能减少类型的数量,因为这里的所有类型都可能是错误的原因