簡體   English   中英

out關鍵字如何與類型協方差關聯?

[英]How is out keyword associated to type co-variance?

我正在閱讀C#中的CovarianceContravariance Covariance

據我了解,

如果我們有Animal類和派生類Cat

Covariance功能使編譯器接受將Cat類型的對象傳遞給Animal類型的對象,而Contravariant則相反。

一切正常,直到我讀了這一行。

“要注釋類型協方差,請使用out參數,而對於convariant,請使用in參數”

據我說,用out關鍵字=>修飾的參數必須在函數中分配給該特定參數。

我很難將out關鍵字與covariance相關聯,而將in關鍵字與covariance contravariant關聯。

這兩個關系如何? 兩者都有超級簡單的例子嗎?

提前致謝。

C#4.0中的協方差和協方差都涉及使用派生類而不是基類的能力。 in / out關鍵字是編譯器提示,用於指示是否將類型參數用於輸入和輸出。 協方差

C#4.0中的協方差由out關鍵字輔助,這意味着使用out類型參數的派生類的泛型類型是可以的。 因此

IEnumerable<Fruit> fruit = new List<Apple>();

由於Apple是水果,因此List可以安全地用作IEnumerable Contravariance

矛盾是in關鍵字,它表示輸入類型,通常在委托中。 原理是相同的,這意味着委托可以接受更多派生類。

public delegate void Func<in T>(T param);

這意味着,如果我們有Func,則可以將其轉換為Func。

Func<Fruit> fruitFunc = (fruit)=>{};
Func<Apple> appleFunc = fruitFunc;

如果它們基本上是相同的東西,為什么將它們稱為協/逆方差?

因為即使原理相同,也可以安全地從派生轉換為基,但在輸入類型上使用時,我們可以安全地將派生較少的類型(Func)轉換為派生較多的類型(Func),這很有意義,因為任何函數拿水果,也可以拿蘋果。

out上下文關鍵字 ,即取決於其位置,它表示不同的含義。
您在談論參數修飾符 但這不是協方差和逆方差。 在通用接口定義中使用關鍵字時,它就是通用修飾符 ,這完全是另外一回事。

out關鍵字具有不同的用途。 正如您在“泛型類型參數”上下文中所指出的那樣,它充當使“協方差”起作用的關鍵字,另一種用法類似於ref關鍵字,我們使用ref關鍵字從Method獲取多個返回值。

如果你看一下文檔進行關鍵字在MSDN中的兩個目的out關鍵字將陸續上市。 不要混淆,它根據上下文表現出不同的行為。

您還可以找到與new關鍵字的相似之處,它也有不同的用途。 他們是

  1. 創建類的新實例。 object obj = new object();
  2. 要顯式地隱藏基類的方法或屬性。 protected new void BaseMethod(){}
  3. 通用參數約束。 private void MyGenericMethod<T>(T t) where T:new()

我認為Microsoft家伙通過使用功能名稱不清晰的名稱和功能參數不好的關鍵字來使此功能非常復雜。

我從向量(Mathe)的協方差和協方差知道這個名字,當我第一次在C#中聽說它時,我感到震驚!

@JoesphAlbahari在其《 C#4簡而言之》一書中對第109-112頁的主題進行了很好的解釋。 我建議您真的閱讀它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM