Sdílet prostřednictvím


Převod uvolněné delegáta (Visual Basic)

Převod uvolněné delegáta umožňuje přiřadit Nah a funkce delegáty nebo obsluhy i v případě, že jejich podpisy nejsou stejné. Proto stane závazným pro delegáty konzistentní s vazbou pro vyvolání metody již povolen. 

Parametry a návratový typ

Namísto podpisu přesná shoda uvolněné převod vyžaduje splnění následujících podmínek při Option Strict je nastavena na On:

  • Rozšiřujícím převodu musí existovat z datového typu každý parametr delegáta na datový typ odpovídajícího parametru přiřazenou funkci nebo Sub.V následujícím příkladu delegáta Del1 má jeden parametr Integer.Parametr m přiřazené lambda výrazy musí mít datový typ, pro který je rozšiřujícím převodu z Integer, jako například Long nebo Double.

    ' Definition of delegate Del1.
    Delegate Function Del1(ByVal arg As Integer) As Integer
    
    ' Valid lambda expression assignments with Option Strict on or off:
    
    ' Integer matches Integer.
    Dim d1 As Del1 = Function(m As Integer) 3
    
    ' Integer widens to Long
    Dim d2 As Del1 = Function(m As Long) 3
    
    ' Integer widens to Double
    Dim d3 As Del1 = Function(m As Double) 3
    

    Zužujícího převodu jsou přípustné pouze tehdy, když Option Strict je nastavena na Off.

    ' Valid only when Option Strict is off:
    
    Dim d4 As Del1 = Function(m As String) CInt(m)
    Dim d5 As Del1 = Function(m As Short) m
    
  • V opačném směru od návratový typ přiřazenou funkci musí existovat rozšiřujícího převodu nebo Sub návratový typ delegáta.V následujících příkladech musí vyhodnotit tělo každého přiřazeného lambda výraz na datový typ, který se rozšiřuje na Integer protože typ návratu del1 je Integer.

    ' Valid return types with Option Strict on:
    
    ' Integer matches Integer.
    Dim d6 As Del1 = Function(m As Integer) m
    
    ' Short widens to Integer.
    Dim d7 As Del1 = Function(m As Long) CShort(m)
    
    ' Byte widens to Integer.
    Dim d8 As Del1 = Function(m As Double) CByte(m)
    

Pokud Option Strict je nastavena na Off, rozšiřování omezení je odebrán v obou směrech.

' Valid only when Option Strict is set to Off.

' Integer does not widen to Short in the parameter.
Dim d9 As Del1 = Function(n As Short) n

' Long does not widen to Integer in the return type.
Dim d10 As Del1 = Function(n As Integer) CLng(n)

Vynechání parametru specifikace

Uvolněné Delegáti také umožňují zcela vynechat specifikace parametru přiřazené metody:

' Definition of delegate Del2, which has two parameters.
Delegate Function Del2(ByVal arg1 As Integer, ByVal arg2 As String) As Integer
' The assigned lambda expression specifies no parameters, even though
' Del2 has two parameters. Because the assigned function in this 
' example is a lambda expression, Option Strict can be on or off.
' Compare the declaration of d16, where a standard function is assigned.
Dim d11 As Del2 = Function() 3

' The parameters are still there, however, as defined in the delegate.
Console.WriteLine(d11(5, "five"))

' Not valid.
' Console.WriteLine(d11())
' Console.WriteLine(d11(5))

Poznámka: nelze zadat některé parametry a ostatní vynechat.

' Not valid.
'Dim d12 As Del2 = Function(p As Integer) p

Možnost vynechání parametrů je užitečné v situaci, jako například obslužné rutiny události, kde se jedná o několik složitých parametrů pro definování.Argumenty pro některé obslužné rutiny události se nepoužívají.Místo toho obslužné přistupuje přímo stav ovládacího prvku, na kterém je zaregistrována událost a ignoruje argumenty.Uvolněné Delegáti umožňují vynechat argumenty v těchto prohlášeních při žádný výsledek nejasnosti.V následujícím příkladu plně zadanou metodu OnClick můžete přepsat jako RelaxedOnClick.

Sub OnClick(ByVal sender As Object, ByVal e As EventArgs) Handles b.Click
    MessageBox.Show("Hello World from" + b.Text)
End Sub

Sub RelaxedOnClick() Handles b.Click
    MessageBox.Show("Hello World from" + b.Text)
End Sub

Příklady AddressOf

Lambda výrazy se používají v předchozích příkladech k usnadnění viz typ relace.Stejné vzat povolují se však pro delegáta přiřazení, které používají AddressOf, Handles, nebo AddHandler.

V následujícím příkladu funkce f1, f2, f3, a f4 lze všechny přiřadit Del1.

' Definition of delegate Del1.
Delegate Function Del1(ByVal arg As Integer) As Integer
' Definitions of f1, f2, f3, and f4.
Function f1(ByVal m As Integer) As Integer
End Function

Function f2(ByVal m As Long) As Integer
End Function

Function f3(ByVal m As Integer) As Short
End Function

Function f4() As Integer
End Function
' Assignments to function delegate Del1.

' Valid AddressOf assignments with Option Strict on or off:

' Integer parameters of delegate and function match.
Dim d13 As Del1 = AddressOf f1

' Integer delegate parameter widens to Long.
Dim d14 As Del1 = AddressOf f2

' Short return in f3 widens to Integer.
Dim d15 As Del1 = AddressOf f3

V následujícím příkladu je platná pouze při Option Strict je nastavena na Off.

' If Option Strict is Off, parameter specifications for f4 can be omitted.
Dim d16 As Del1 = AddressOf f4

' Function d16 still requires a single argument, however, as specified
' by Del1.
Console.WriteLine(d16(5))

' Not valid.
'Console.WriteLine(d16())
'Console.WriteLine(d16(5, 3))

Funkce vrátí uvolněním

Převod uvolněné delegáta umožňuje přiřadit funkce Sub delegáta, účinně ignorování vrácená hodnota funkce.Však nelze přiřadit Sub funkce delegátovi.V následujícím příkladu adresy funkce doubler je přiřazen k Sub delegáta Del3.

' Definition of Sub delegate Del3.
Delegate Sub Del3(ByVal arg1 As Integer)

' Definition of function doubler, which both displays and returns the
' value of its integer parameter.
Function doubler(ByVal p As Integer) As Integer
    Dim times2 = 2 * p
    Console.WriteLine("Value of p: " & p)
    Console.WriteLine("Double p:   " & times2)
    Return times2
End Function
' You can assign the function to the Sub delegate:
Dim d17 As Del3 = AddressOf doubler

' You can then call d17 like a regular Sub procedure.
d17(5)

' You cannot call d17 as a function. It is a Sub, and has no 
' return value.
' Not valid.
'Console.WriteLine(d17(5))

Viz také

Úkoly

Jak: postupy předat jiné procedury v jazyce Visual Basic

Referenční dokumentace

Možnost přísné prohlášení

Koncepty

Lambda výrazy (Visual Basic)

Rozšiřování a zužující převody (Visual Basic)

Místní odvození typu (Visual Basic)

Další zdroje

Delegáti (Visual Basic)