2015-06-25 34 views
4

我最近已被分配到現有應用程序的一些維護工作。我已經遇到了下面的代碼:「關鍵字中的c#泛型」

public interface IEntityService<T, in TKey> 
{ 
    T GetEntityById(TKey id);  
    IEnumerable<T> GetAll();  
    void Update(T entity);  
    void Delete(TKey key); 
} 

我不知道該in關鍵字做什麼第二個一般的參數,TKey

我碰到下面的MSDN這條(應該)解釋給我完美傳來:
in (Generic Modifier) (C# Reference)

不過,我不真正理解。以下是它的說明:

對於通用類型參數,in關鍵字指定類型 參數是逆變。您可以在通用的 接口和委託中使用in關鍵字。

逆變使您可以使用比通用參數指定的派生類型少的 。這允許 用於隱式轉換實現變體接口 的類和隱式轉換委託類型。對於參考 類型,支持泛型類型參數的協變性和 逆變,但它們不支持值類型。

A型可以是 聲明逆變在通用接口或委託如果只是用作類型的方法參數 ,而不是用作方法 返回類型。參考和輸出參數不能是變體。

具有逆變類型參數的接口 允許它的方法接受更少派生類型比那些由接口 類型參數中指定的 參數。例如,因爲在.NET Framework 4的IComparer接口中,類型T是逆變型的,所以可以將IComparer(Of Person)類型的對象分配給 IComparer(Of Employee)類型的對象,而不使用任何特殊轉換 方法如果Employee繼承Person。

甲逆變代表可以是 分配相同類型的另一個代表,但具有較少衍生 一般類型參數。

我想這是有道理的,但特別援引

逆變使您可以使用更少派生類型比泛型參數指定 。

它怎麼能用於int?有沒有我會傳入的「派生類型」?

+0

read [this](https://msdn.microsoft.com/en-us/library/dd799517(v = vs.110).aspx) – dotctor

+0

'int'是一個值類型,正如引用的那樣,*泛型類型參數的協方差和反變量支持引用類型* ***,但它們不支持值類型***。 –

+0

謝謝你。所以答案是它什麼都不做,可能不應該在那裏,對吧?雖然它的確教會了我有關方差和不變性!所以沒有壞事;-) – bgs264

回答

3

我注意到int的唯一引用是在你問題的最後一行。你確定IEntityService<>只能與int鑰匙一起使用嗎?也許這是爲Compound Key(多列組成的主鍵)內置現在

,NHibernate的,例如,對於複合鍵使用一整類來代表他們,所以你可以有一個表MyTable一個

class MyTableKey 
{ 
    public int Code; 
    public int SubCode; 
} 

如果您連接到該表中的輔助表MuSubtable然後你可以有

class MySubtableKey : MyTableKey 
{ 
    public int SubSubCode; 
} 

其中MySubtable是具有作爲主鍵的全科主表y的MyTableCode + SubCode)加上另一個字段(SubSubCode)。