C#通用约束问题

问题描述:

我收到以下错误。C#通用约束问题

类型“Test.ICacheProvider”不能被用作在通用类型的类型参数 “TStorageProvider”或方法 “StorageManager.Test.IFileInfo”。没有 从 'StorageManager.Test.ICacheProvider'到 'StorageManager.Test.IStorageProvider'的隐式引用转换。

这个程序设计结构有什么不对吗?

计划:

// Cache Provider Classes 

public interface ICacheProvider { } 

public class BaseCacheProvider : ICacheProvider { } 

public class DerivedCacheProvider : BaseCacheProvider { } 

// Storage Classes 
public interface IStorageProvider<TCacheProvider> where TCacheProvider : 
    ICacheProvider { } 

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

public interface DerivedStorageProvider : BaseStorageProvider<ICacheProvider> { } 

// User Classes 
public interface IFileInfo<TStorageProvider> 
    where TStorageProvider : IStorageProvider<ICacheProvider> { } 

public class FileInfo : IFileInfo<ICacheProvider> { } 
+2

您能告诉我们产生错误的行吗? – Carsten 2013-03-27 10:00:00

+0

FileInfo类的声明行有错误。 – 2013-03-27 10:01:04

+0

我错过了这个程序中缺少的东西吗? – 2013-03-27 10:02:38

的错误是在FileInfo类的定义。您将模板参数设置为ICacheProvider,但约束条件是模板参数必须为IStorageProvider<ICacheProvider>

这可能会更好:

public interface FileInfo 
      : IFileInfo<IStorageProvider<ICacheProvider>> 

即使你的名字不匹配:IFileInfo需要存储供应商,而是你给它缓存提供商。

+1

或者将ICacheProvider的声明更改为:'public interface ICacheProvider:IStorageProvider ' – 2013-03-27 10:04:02

+0

@MatthewWatson:ICacheProvider可以有一个约束,它需要它自己是另一个接口的类型参数吗? – Carsten 2013-03-27 10:10:43

+0

这没有意义。你只能约束事先不知道的东西。你可以“约束”一个接口来确保它继承另一个接口。 – 2013-03-27 10:14:58

你的约束missmatching:

// User Classes 
public interface IFileInfo<TStorageProvider> 
    where TStorageProvider : IStorageProvider<ICacheProvider> { } 

public class FileInfo : IFileInfo<ICacheProvider> { } 

FileInfo被声明为IFileInfoICacheProvider类型的通用说法。但IFileInfo有约束,让我们只接受IStorageProvider s。而ICacheProvider不是IStorageProvider