首頁 >後端開發 >C++ >.NET 泛型中的協變、逆變和「in」/「out」關鍵字是什麼?

.NET 泛型中的協變、逆變和「in」/「out」關鍵字是什麼?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-20 17:27:09496瀏覽

What are Covariance, Contravariance, and the

.NET泛型中的協變、逆變與「in/out」詳解

協變和逆變在.NET泛型介面和委託的設計中起著至關重要的作用。它們決定了在不同場景下如何安全地替換泛型類型。

協變與逆變

協變允許使用更“派生”(更具體)的類型來代替原始類型,前提是原始類型僅作為“返回值”(例如,作為返回值)。相反,逆變允許使用更“基底”(更不具體)的類型來代替原始類型,前提是原始類型僅作為“輸入”(例如,作為方法參數)。

「in」與「out」

「in」和「out」關鍵字分別是協變和逆變的簡寫。當泛型類型僅作為傳回值出現時,使用「out」;當泛型類型僅作為方法參數出現時,使用「in」。

關係闡明

文中關於無法將List視為List的例子闡述了逆變的概念。向更具體的(派生)類型寫入資料意味著使用“in”約束(逆變),因為被寫入的資料類型應該更具體。

使用泛型介面的深入解釋

為了更深入地理解協變和逆變,考慮以下兩個泛型方法:

<code>public Base DoSomething(int variable)
public Derived DoSomethingElse(int variable)</code>

假設一個介面MyInterface,其中有一個方法MyFunction(int variable),該方法傳回一個T。

  • 使用「out」修飾T:interface MyInterface<out T>表示T只能用作回傳類型。將MyInterface賦值給MyInterface是有效的,因為Derived是Base的派生類型。
  • 使用「in」修飾T:interface MyInterface<in T>表示T只能用作方法參數。將MyInterface賦值給MyInterface是無效的,因為它違反了逆變規則。

總結

理解協變、逆變和「in/out」的概念對於有效使用.NET中的泛型至關重要。它允許您透過確保根據泛型類型的用法正確替換泛型類型來建立類型安全的程式碼。

以上是.NET 泛型中的協變、逆變和「in」/「out」關鍵字是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn