2013-03-27 125 views
3

我收到以下錯誤。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

回答

7

的錯誤是在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

1

你的約束missmatching:

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

public class FileInfo : IFileInfo<ICacheProvider> { } 

FileInfo被聲明爲IFileInfoICacheProvider類型的通用說法。但IFileInfo有約束,讓我們只接受IStorageProvider s。而ICacheProvider不是IStorageProvider