C#泛型约束问题

3

我收到了以下错误:

类型 'Test.ICacheProvider' 无法用作泛型类型或方法 'StorageManager.Test.IFileInfo' 中的类型参数 'TStorageProvider'。从 '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
FileInfo类的声明行存在错误。 - Rajdip Patel
这个程序有什么漏洞吗? - Rajdip Patel
错误信息显示:“类型“Test.ICacheProvider””,但是您提供的代码中没有定义Test类。 - Carsten
在注释“// 存储类”之后,您定义了三个接口。是注释错误还是代码错误? - AakashM
2个回答

7
错误出现在FileInfo类的定义中。你将模板参数设置为ICacheProvider,但约束条件是模板参数必须是IStorageProvider<ICacheProvider>
可能更好的写法是:
public interface FileInfo
          : IFileInfo<IStorageProvider<ICacheProvider>>

即使你们的名称不匹配:IFileInfo 需要 存储 提供程序,但你提供了 缓存 提供程序。


1
或者将ICacheProvider的声明更改为:public interface ICacheProvider: IStorageProvider<ICacheProvider> - Matthew Watson
@MatthewWatson:ICacheProvider 可以有一个约束条件,要求它自己是另一个接口的类型参数吗?! - Carsten
这没有意义。你只能约束那些事先不知道的东西。但是,你可以“约束”一个接口以确保它继承另一个接口。 - Toni Petrina
@MatthewWatson:抱歉...我打错字了..."constraint"是错误的,我想说的是*"继承自一个要求继承接口作为泛型参数的接口"*...如果它能工作,那就很好了解!我之前不知道这个!^^听起来有点像C++元编程中的"通用递归"。 - Carsten
1
@Ashratt:这有点像(但不完全相同)“奇异递归模板模式”:http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx - Matthew Watson
显示剩余2条评论

1
您的限制条件不匹配:
// User Classes
public interface IFileInfo<TStorageProvider> 
    where TStorageProvider : IStorageProvider<ICacheProvider> { }

public class FileInfo : IFileInfo<ICacheProvider> { }

FileInfo声明为一个具有类型参数ICacheProviderIFileInfo。然而,IFileInfo有一个约束条件,只能接受IStorageProvider。而ICacheProvider不是IStorageProvider


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接