在 Visual Basic 中,共變性和反變性可以啟用陣列型別、委派型別和泛型型別參數的隱式參考轉換。 共變性保留指派相容性,而反變性則反轉它。
下列程式代碼示範指派相容性、共變數和反變數之間的差異。
' Assignment compatibility.
Dim str As String = "test"
' An object of a more derived type is assigned to an object of a less derived type.
Dim obj As Object = str
' Covariance.
Dim strings As IEnumerable(Of String) = New List(Of String)()
' An object that is instantiated with a more derived type argument
' is assigned to an object instantiated with a less derived type argument.
' Assignment compatibility is preserved.
Dim objects As IEnumerable(Of Object) = strings
' Contravariance.
' Assume that there is the following method in the class:
' Shared Sub SetObject(ByVal o As Object)
' End Sub
Dim actObject As Action(Of Object) = AddressOf SetObject
' An object that is instantiated with a less derived type argument
' is assigned to an object instantiated with a more derived type argument.
' Assignment compatibility is reversed.
Dim actString As Action(Of String) = actObject
陣列的共變性允許您將更多衍生類型的陣列隱含地轉換成較少衍生類型的陣列。 但此作業的類型並不安全,如下列程式代碼範例所示。
Dim array() As Object = New String(10) {}
' The following statement produces a run-time exception.
' array(0) = 10
方法群組的共變數和反變數支持允許比對具有委派類型的方法簽章。 此比對可讓您不僅指派具有相符簽章的方法給委託,還可以指派其他方法:
- 傳回比委派型別所指定的傳回型別更衍生的類型(共變數)。
- 接受比委派類型指定的類型更少衍生類型的參數(反變異性)。
如需詳細資訊,請參閱委派中的變異數(Visual Basic)和使用委派中的變異數(Visual Basic)。
下列程式代碼範例顯示方法群組的共變數和反變數支援。
Shared Function GetObject() As Object
Return Nothing
End Function
Shared Sub SetObject(ByVal obj As Object)
End Sub
Shared Function GetString() As String
Return ""
End Function
Shared Sub SetString(ByVal str As String)
End Sub
Shared Sub Test()
' Covariance. A delegate specifies a return type as object,
' but you can assign a method that returns a string.
Dim del As Func(Of Object) = AddressOf GetString
' Contravariance. A delegate specifies a parameter type as string,
' but you can assign a method that takes an object.
Dim del2 As Action(Of String) = AddressOf SetObject
End Sub
在 .NET Framework 4 或更新版本中,Visual Basic 支援泛型介面和委派中的共變數和反變數,並允許隱含轉換泛型類型參數。 如需詳細資訊,請參閱 泛型介面中的變數 (Visual Basic) 和 委派中的變異數 (Visual Basic) 。
下列程式代碼範例顯示泛型介面的隱含參考轉換。
Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings
如果泛型參數宣告為 covariant 或 contravariant,則稱為 泛 型介面或委派。 Visual Basic 可讓您建立自己的變體介面和委派。 如需詳細資訊,請參閱 建立變化型泛型介面(Visual Basic) 和 委派中的變異數(Visual Basic)。
相關文章
| 標題 | 說明 |
|---|---|
| 泛型介面中的變數 (Visual Basic) | 討論泛型介面中的共變數和反變數,並提供 .NET Framework 中的變體泛型介面清單。 |
| 建立變體泛型介面(Visual Basic) | 示範如何建立自定義變體介面。 |
| 在泛型集合的介面中使用變數 (Visual Basic) | 示範如何在IEnumerable<T> 和IComparable<T> 介面中支援的共變數和反變數有助於您重複利用程式碼。 |
| 委派中的變異(Visual Basic) | 討論泛型和非泛型委派中的協變和逆變,並提供 .NET Framework 中的變體泛型委派清單。 |
| 在委派中使用變數 (Visual Basic) | 示範如何在非泛型委派中使用共變數和反變數支援,以比對方法簽章與委派類型。 |
| 針對 Func 和 Action 泛型委派使用變數 (Visual Basic) | 顯示 Func 和 Action 委任物件中對共變數和反變數的支援如何協助您重複使用代碼。 |