Conversione di tipo relaxed del delegato (Visual Basic)Relaxed Delegate Conversion (Visual Basic)

Conversione di tipo relaxed del delegato consente di assegnare subroutine e funzioni a delegati o gestori anche quando le relative firme non sono identiche.Relaxed delegate conversion enables you to assign subs and functions to delegates or handlers even when their signatures are not identical. Pertanto, l'associazione ai delegati diventa coerenti con l'associazione già consentito per le chiamate ai metodi.Therefore, binding to delegates becomes consistent with the binding already allowed for method invocations.

I parametri e il tipo restituitoParameters and Return Type

Al posto di esatta corrispondenza della firma, la conversione di tipo "relaxed" richiede che essere soddisfatte le condizioni seguenti quando si Option Strict è impostata su On:In place of exact signature match, relaxed conversion requires that the following conditions be met when Option Strict is set to On:

  • Deve esistere una conversione verso un dal tipo di dati di ogni parametro del delegato per il tipo di dati del parametro corrispondente della funzione assegnata o Sub.A widening conversion must exist from the data type of each delegate parameter to the data type of the corresponding parameter of the assigned function or Sub. Nell'esempio seguente, il delegato Del1 ha un parametro, un Integer.In the following example, the delegate Del1 has one parameter, an Integer. Parametro m nell'espressione lambda assegnata espressioni devono presentare un tipo di dati per il quale viene eseguita una conversione widening dal Integer, ad esempio Long o Double.Parameter m in the assigned lambda expressions must have a data type for which there is a widening conversion from Integer, such as Long or 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
    

    Conversioni di Narrowing sono consentite solo quando Option Strict è impostata su Off.Narrowing conversions are permitted only when Option Strict is set to 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
    
  • Deve esistere una conversione verso un nella direzione opposta dal tipo restituito della funzione assegnata o Sub nel tipo restituito del delegato.A widening conversion must exist in the opposite direction from the return type of the assigned function or Sub to the return type of the delegate. Negli esempi seguenti, deve restituire il corpo di ogni espressione lambda assegnata a un tipo di dati che si amplia in Integer perché il tipo restituito di del1 è Integer.In the following examples, the body of each assigned lambda expression must evaluate to a data type that widens to Integer because the return type of del1 is 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)
    

Se Option Strict è impostata su Off, l'ampliamento restrizione è stata rimossa in entrambe le direzioni.If Option Strict is set to Off, the widening restriction is removed in both directions.

' 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)

Omettendo le specifiche dei parametriOmitting Parameter Specifications

Delegati di tipo relaxed consentono anche di omettere completamente le specifiche dei parametri nel metodo assegnato:Relaxed delegates also allow you to completely omit parameter specifications in the assigned method:

' 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))

Si noti che non è possibile specificare alcuni parametri e omettere gli altri.Note that you cannot specify some parameters and omit others.

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

La possibilità di omettere i parametri è utile in situazioni, ad esempio definendo un gestore eventi, in cui sono coinvolti diversi parametri complessi.The ability to omit parameters is helpful in a situation such as defining an event handler, where several complex parameters are involved. Gli argomenti per alcuni gestori di eventi non vengono utilizzati.The arguments to some event handlers are not used. Al contrario, il gestore accede direttamente lo stato del controllo in cui è registrato l'evento e gli argomenti vengono ignorati.Instead, the handler directly accesses the state of the control on which the event is registered, and ignores the arguments. Delegati di tipo relaxed consentono di omettere gli argomenti nelle dichiarazioni di questo tipo quando nessun risultato le ambiguità.Relaxed delegates allow you to omit the arguments in such declarations when no ambiguities result. Nell'esempio seguente, il metodo specificato completamente OnClick può essere riscritta come RelaxedOnClick.In the following example, the fully specified method OnClick can be rewritten as 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  

Esempi di AddressOfAddressOf Examples

Le espressioni lambda vengono usate negli esempi precedenti in modo semplice visualizzare le relazioni di tipo.Lambda expressions are used in the previous examples to make the type relationships easy to see. Tuttavia, gli allentamenti stesso sono consentiti per le assegnazioni di delegato che usano AddressOf, Handles, o AddHandler.However, the same relaxations are permitted for delegate assignments that use AddressOf, Handles, or AddHandler.

Nell'esempio seguente, le funzioni f1, f2, f3, e f4 possono essere assegnati a Del1.In the following example, functions f1, f2, f3, and f4 can all be assigned to 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

L'esempio seguente è valido solo quando Option Strict è impostata su Off.The following example is valid only when Option Strict is set to 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))

Eliminazione di elementi restituiti da funzioniDropping Function Returns

Conversione di tipo relaxed del delegato che consente di assegnare una funzione a un Sub delegato, in modo efficace, ignorando il valore restituito della funzione.Relaxed delegate conversion enables you to assign a function to a Sub delegate, effectively ignoring the return value of the function. Tuttavia, non è possibile assegnare un Sub a un delegato di funzione.However, you cannot assign a Sub to a function delegate. Nell'esempio seguente, l'indirizzo della funzione doubler viene assegnato a Sub delegare Del3.In the following example, the address of function doubler is assigned to Sub delegate 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))

Vedere ancheSee also