我最近已被分配到現有應用程序的一些維護工作。我已經遇到了下面的代碼:「關鍵字中的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
?有沒有我會傳入的「派生類型」?
read [this](https://msdn.microsoft.com/en-us/library/dd799517(v = vs.110).aspx) – dotctor
'int'是一個值類型,正如引用的那樣,*泛型類型參數的協方差和反變量支持引用類型* ***,但它們不支持值類型***。 –
謝謝你。所以答案是它什麼都不做,可能不應該在那裏,對吧?雖然它的確教會了我有關方差和不變性!所以沒有壞事;-) – bgs264