완화된 대리자 변환(Visual Basic)Relaxed Delegate Conversion (Visual Basic)

완화 된 대리자 변환을 사용 하면 해당 시그니처가 동일 하지 않은 경우에 대리자 또는 처리기에 sub 및 함수를 할당할 수 있습니다.Relaxed delegate conversion enables you to assign subs and functions to delegates or handlers even when their signatures are not identical. 따라서 대리자를 바인딩할 메서드 호출을 이미 허용 바인딩을 사용 하 여 일치 됩니다.Therefore, binding to delegates becomes consistent with the binding already allowed for method invocations.

매개 변수 및 반환 형식Parameters and Return Type

낮은 수준의 변환을 서명이 완전히 일치 하는 대신 다음 조건이 충족 되어야 필요한 경우 Option Strict 로 설정 된 On:In place of exact signature match, relaxed conversion requires that the following conditions be met when Option Strict is set to On:

  • 할당 된 함수의 해당 매개 변수의 데이터 형식으로 각 대리자 매개 변수의 데이터 형식에서 확대 변환이 있어야 하거나 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. 다음 예제에서는 대리자 Del1 하나의 매개 변수가 Integer합니다.In the following example, the delegate Del1 has one parameter, an Integer. 매개 변수 m 할당 된 람다 식에서 확대 변환이 없는 데이터 형식이 있어야 Integer와 같은 Long 또는 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
    

    축소 변환은 경우에만 허용 됩니다 Option Strict 로 설정 된 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
    
  • 할당 된 함수의 반환 형식에서 반대 방향으로의 확대 변환이 있어야 합니다. 또는 Sub 대리자의 반환 형식입니다.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. 다음 예제에서 각 할당 된 람다 식의 본문으로 확대 되는 데이터 형식으로 계산 되어야 Integer 의 반환 형식인 del1Integer합니다.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)
    

하는 경우 Option Strict 로 설정 된 Off는 양쪽 방향에서 제거 되었습니다 제한 확대 합니다.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)

매개 변수 사양 생략Omitting Parameter Specifications

완화 된 대리자는 할당 된 메서드의 매개 변수 사양을 완전히 생략할 수 있습니다.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))

참고 일부 매개 변수를 지정 및 다른 사용자를 생략할 수 없습니다.Note that you cannot specify some parameters and omit others.

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

매개 변수를 생략할 수 있는 몇 가지 복잡 한 매개 변수 관련 된 이벤트 처리기를 정의 하는 경우에 유용 합니다.The ability to omit parameters is helpful in a situation such as defining an event handler, where several complex parameters are involved. 일부 이벤트 처리기에 대 한 인수를 사용 하지 않습니다.The arguments to some event handlers are not used. 대신, 처리기는 이벤트가 등록 되 고 인수를 무시 하는 컨트롤의 상태를 직접 액세스 합니다.Instead, the handler directly accesses the state of the control on which the event is registered, and ignores the arguments. 완화 된 대리자를 사용 하면 모호성이 없는 이러한 선언에서 인수를 생략할 수 있습니다.Relaxed delegates allow you to omit the arguments in such declarations when no ambiguities result. 다음 예제에서는 완벽 하 게 지정된 된 메서드 OnClick 다시 작성할 수 있습니다 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  

AddressOf 예제AddressOf Examples

람다 식은 형식 관계를 쉽게 확인할 수 있도록 이전 예제에서 사용 됩니다.Lambda expressions are used in the previous examples to make the type relationships easy to see. 그러나 동일한 relaxation을 사용 하는 대리자 할당 허용 되 AddressOf, Handles, 또는 AddHandler합니다.However, the same relaxations are permitted for delegate assignments that use AddressOf, Handles, or AddHandler.

다음 예제에서는 함수 f1, f2f3, 및 f4 모두에 할당할 수 있습니다 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

다음 예제는 경우에만 유효 Option Strict 로 설정 된 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))

함수 반환 값 삭제Dropping Function Returns

완화 된 대리자 변환을 사용 하면 함수를 할당 하는 Sub 대리자를 효과적으로 함수의 반환 값을 무시 합니다.Relaxed delegate conversion enables you to assign a function to a Sub delegate, effectively ignoring the return value of the function. 그러나 할당할 수 없습니다를 Sub 함수 대리자입니다.However, you cannot assign a Sub to a function delegate. 다음 예제에서는 함수의 주소로 doubler 에 할당 됩니다 Sub 대리자 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))

참고자료See also