Aracılığıyla paylaş


Gevşek Temsilci Dönüşümü (Visual Basic)

Gevşek temsilci dönüştürme, hatta kendi imzaları aynı olmadığında altyordam ve işlevleri Temsilciler veya işleyicileri atamanıza olanak verir. Bu nedenle, temsilciler bağlama yöntemi çağırmaları için önceden izin bağlama ile tutarlı olur. 

Parametreleri ve dönüş türü

Tam imza eşleştirme yerine gevşek dönüştürme aşağıdaki koşulların karşılanması gerekir, Option Strict ayarlamak On:

  • Widening conversion her temsilci parametre veri türünü atanmış işlevinin karşılık gelen parametrenin veri türünü mevcut olmalıdır veya Sub.Aşağıdaki örnekte, temsilci Del1 bir parametresi olan bir Integer.Parametre m atanan lambda ifadeleri ise gelen widening conversion kendisi için bir veri türü olması gerekir Integer, gibi Long veya 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
    

    Daraltma dönüşümler yalnızca izin verilen Option Strict ayarlamak 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
    
  • Atanan işlevin dönüş türü arasında ters yönde widening conversion bulunmalıdır veya Sub temsilci dönüş türü için.Aşağıdaki örneklerde, her atanan lambda ifade gövdesi için widens bir veri türü değerlendirmelidir Integer dönüş türü olduğundan del1 olan 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 Ayarlamak Off, kısıtlama widening her iki yönde de kaldırılır.

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

Parametre özellikleri atlama

Gevşek Temsilciler de tamamen parametresi belirtimleri atanan yönteminde atlamak izin ver:

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

Edemez bazı parametrelerini belirtin ve diğerlerini ihmal olduğunu unutmayın.

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

Yeteneği parametresini de atlarsanız, burada bazı karmaşık Parametreler söz konusu olan bir olay işleyicisi tanımlama gibi bir durumda yararlıdır.Bazı olay işleyicileri bağımsız kullanılmaz.Bunun yerine, işleyici üzerinde olay kaydedilir ve bağımsız değişkenlerini yoksayar denetim durumunu doğrudan erişir.Gevşek Temsilciler, ambiguities sonuç, bu gibi bildirimleri değişkenlerde atlamak olanak sağlar.Aşağıdaki örnekte, tam olarak belirtilen yöntem OnClick olarak yeniden 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 örnekleri

Lambda ifadeleri, önceki örneklerde görmek tür ilişkileri kolaylaştırmak için kullanılır.Ancak, aynı relaxations kullanan temsilci atama için izin verilir AddressOf, Handles, veya AddHandler.

Aşağıdaki örnekte, işlev f1, f2, f3, ve f4 tüm atanabilir 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

Aşağıdaki örnek yalnızca geçerli olduğunda ise Option Strict ayarlamak 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))

Bırakma işlevini verir

Gevşek temsilci dönüştürme sağlayan bir işlev atamak, bir Sub temsilci, etkili bir şekilde işlevin dönüş değeri göz ardı ediliyor.Ancak, atayamazsınız bir Sub işlevi temsilci belirlenecek.Aşağıdaki örnekte işlevin adresi doubler için atanmış Sub temsilci 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))

Ayrıca bkz.

Görevler

Nasıl yapılır: Visual Basic'de Başka Bir Yordama Yordam Geçirme

Başvuru

Option Strict Deyimi

Kavramlar

Lambda İfadeleri (Visual Basic)

Genişletme ve Daraltma Dönüşümleri (Visual Basic)

Yerel Türü Arabirimi (Visual Basic Başvurusu)

Diğer Kaynaklar

Temsilciler (Visual Basic)