2012-06-08 56 views
2

這類似於另一個話題我最近公佈,但也許這可能是簡單和清晰:C#上溯造型泛型類型接口

我要完成以下(或非常類似的東西)...

IManageableEntryDao<IManageableEntry> dao = new CompanyNameDao(); 

...有以下類:

public interface IManageableEntry { 
    string Name { get; set; } 
} 

public class CompanyName : IManageableEntry { 
    public string Name { get; set; } 
} 

public interface IManageableEntryDao<T> where T : IManageableEntry { 
} 

public class CompanyNameDao : IManageableEntryDao<CompanyName> { 
} 

如果我嘗試做一個投as IManageableEntryDao<IManageableEntry>,我得到一個空。

+0

所以這不會在C#3.5中可行嗎? –

+0

可悲的是,沒有。至少,不直接。您必須找到解決方法,例如使'CompanyNameDao'繼承於'IManageableEntryDao ';這是你的要求。 – univerio

+0

正確,那不太優雅,因爲那麼CompanyNameDao返回IManageableEntry對象而不是CompanyName對象。 –

回答

2

查看Variance in Generic Interfaces。將界面更改爲IManageableEntryDao<out T>,它應該可以工作(除非界面以使其無效的方式使用界面)。

4

我相信你需要covariance這個工作。此功能僅在C#4.0中提供。你需要做什麼:

public interface IManageableEntryDao<out T> where T : IManageableEntry { }