C#一般协方差

C#一般协方差,c#,.net,C#,.net,我在DerivedFileInfo类声明中遇到错误。 错误:“StorageManager.Test.DerivedStorageProvider”类型无法识别 在泛型类型中用作类型参数“TStorageProvider”,或 方法“StorageManager.Test.BaseFileInfo”。没有隐含的 从“StorageManager.Test.DerivedStorageProvider”的引用转换 至“StorageManager.Test.IStorageProvider” 是否

我在DerivedFileInfo类声明中遇到错误。

错误:“StorageManager.Test.DerivedStorageProvider”类型无法识别 在泛型类型中用作类型参数“TStorageProvider”,或 方法“StorageManager.Test.BaseFileInfo”。没有隐含的 从“StorageManager.Test.DerivedStorageProvider”的引用转换 至“StorageManager.Test.IStorageProvider”

是否缺少泛型约束或我需要泛型协变约束?

public interface ICacheProvider
{
}

public class BaseCacheProvider : ICacheProvider
{
}

public class DerivedCacheProvider : BaseCacheProvider
{

}

public interface IStorageProvider<TCacheProvider> where TCacheProvider : ICacheProvider
{
}

public abstract class BaseStorageProvider<TCacheProvider> : IStorageProvider<TCacheProvider> where TCacheProvider : ICacheProvider
{
}

public class DerivedStorageProvider : BaseStorageProvider<DerivedCacheProvider>
{
}

public interface IResourceInfo<TStorageProvider> where TStorageProvider : IStorageProvider<ICacheProvider>
{
}

public abstract class ResourceInfo<TStorageProvider> : IResourceInfo<TStorageProvider>
    where TStorageProvider : IStorageProvider<ICacheProvider>
{
}

public abstract class BaseFileInfo<TStorageProvider> : ResourceInfo<TStorageProvider> where TStorageProvider : IStorageProvider<ICacheProvider>
{
}

public class DerivedFileInfo : BaseFileInfo<DerivedStorageProvider>
{ 
}
公共接口提供程序
{
}
公共类BaseCacheProvider:ICacheProvider
{
}
公共类DerivedCacheProvider:BaseCacheProvider
{
}
公共接口IStorageProvider,其中TCacheProvider:ICacheProvider
{
}
公共抽象类BaseStorageProvider:IStorageProvider,其中TCacheProvider:ICacheProvider
{
}
公共类DerivedStorageProvider:BaseStorageProvider
{
}
公共接口IResourceInfo,其中TStorageProvider:IStorageProvider
{
}
公共抽象类ResourceInfo:IResourceInfo
其中TStorageProvider:IStorageProvider
{
}
公共抽象类BaseFileInfo:ResourceInfo其中TStorageProvider:IStorageProvider
{
}
公共类DerivedFileInfo:BaseFileInfo
{ 
}

与?如果我使用协方差进行接口定义,则此程序将编译。否。我打错了上面的程序。所以程序与此不同。将协变参数添加到
IStorageProvider
应该可以工作,
公共接口IStorageProvider其中TCacheProvider:ICacheProvider
,我看不出有任何问题-您有什么理由认为这可能不是正确的解决方案吗?我对该解决方案没有异议。但我对C#泛型非常陌生。所以我想尝试比协方差更好的解决方案。