다음을 통해 공유


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

완화된 대리자 변환을 사용하면 시그니처가 동일하지 않은 경우에도 대리자나 처리기에 sub 및 함수를 할당할 수 있습니다. 따라서 대리자에 대한 바인딩이 메서드 호출에 대해 이미 허용된 기존 바인딩과 동일해집니다. 

매개 변수 및 반환 형식

완화된 변환은 완전히 일치하는 시그니처 대신 Option Strict가 On으로 설정된 경우 다음과 같은 조건만 충족되면 됩니다.

  • 각 대리자 매개 변수의 데이터 형식에서 할당된 함수 또는 Sub의 해당 매개 변수의 데이터 형식으로 확대 변환이 가능해야 합니다. 다음 예제에서 대리자 Del1은 Integer 형식의 매개 변수 한 개를 사용합니다. 할당된 람다 식의 m 매개 변수는 Integer에서 확대 변환 가능한 데이터 형식(예: Long 또는 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로 설정된 경우에만 허용됩니다.

    ' 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의 반환 형식에서 대리자의 반환 형식으로도 확대 변환이 가능해야 합니다. 다음 예제에서 del1의 반환 형식은 Integer이므로 할당된 각 람다 식의 본문은 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로 설정된 경우에는 양방향 모두에서 확대 변환 제한이 적용되지 않습니다.

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

매개 변수 사양 생략

완화된 대리자를 사용하면 할당된 메서드에서 매개 변수 사양을 아예 생략할 수도 있습니다.

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

일부 매개 변수는 지정할 수 없고 일부 매개 변수는 생략할 수 없습니다.

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

여러 개의 복잡한 매개 변수가 관련된 이벤트 처리기를 정의하는 경우에 매개 변수를 생략하면 유용합니다. 일부 이벤트 처리기의 인수는 사용되지 않습니다. 대신 처리기는 이벤트가 등록되어 있는 컨트롤의 상태에 직접 액세스하고 인수를 무시합니다. 완화된 대리자를 사용하면 모호성이 없는 선언에서 인수를 생략할 수 있습니다. 다음 예제에서는 완전하게 지정된 OnClick 메서드를 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, Handles 또는 AddHandler를 사용하는 대리자 할당에도 이와 같은 완화 기능을 사용할 수 있습니다.

다음 예제에서는 f1, f2, f3 및 f4 함수 모두 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로 설정된 경우에만 유효합니다.

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

함수 반환 값 삭제

완화된 대리자 변환을 사용하면 Sub 대리자에 함수를 할당하여 함수의 반환 값을 효율적으로 무시할 수 있습니다. 그러나 Sub를 함수 대리자에 할당할 수는 없습니다. 다음 예제에서는 doubler 함수의 주소를 Sub 대리자 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))

참고 항목

작업

방법: Visual Basic에서 프로시저에 다른 프로시저 전달

참조

Option Strict 문

개념

람다 식(Visual Basic)

확대 변환과 축소 변환(Visual Basic)

지역 형식 유추(Visual Basic)

기타 리소스

대리자(Visual Basic)