求助:关于委托签名和使用它的函数不一致的问题
vb.net吧
全部回复
仅看楼主
level 10
liqiochi 楼主
最近自学vb.net时使用的《Professional Visual Basic 2012 and .NET 4.5 Programming》
一上书看到如下代码:(我把不相关的代码省略了)
Module Sort
Public Delegate Function Compare(ByVal v1 As Object, ByVal v2 As Object) As Boolean
Public Sub DoSort(ByVal theData() As Object, ByVal GreaterThan As Compare)
Dim outer As Integer
Dim inner As Integer
Dim temp As Object
For outer = 0 To UBound(theData)
For inner = outer + 1 To UBound(theData)
If GreaterThan.Invoke(theData(outer), theData(inner)) Then
temp = theData(outer)
theData(outer) = theData(inner)
theData(inner) = temp
End If
Next
Next
End Sub
End Module
Public Class Person
Public Shared Function CompareAge(ByVal Person1 As Person, _
ByVal Person2 As Person) As Boolean
Return Person1.Age > Person2.Age
End Function
Public Shared Function CompareAge(ByVal Person1 As Object, _
ByVal Person2 As Object) As Boolean
Return CType(Person1, Person).Age > CType(Person2, Person).Age
End Function
Public Shared Function CompareName(ByVal Person1 As Object, _
ByVal Person2 As Object) As Boolean
Return CType(Person1, Person).Name > CType(Person2, Person).Name
End Function
End Class
Public Class Form1
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim myPeople(4) As Person
myPeople(0) = New Person("Fred",
#7/9/1960#
)
myPeople(1) = New Person("Mary",
#1/21/1955#
)
myPeople(2) = New Person("Sarah",
#2/1/1960#
)
myPeople(3) = New Person("George",
#5/13/1970#
)
myPeople(4) = New Person("Andre",
#10/1/1965#
)
DoSort(myPeople, AddressOf Person.CompareName)
End Sub
End Class
在sort模块中的dosort过程里,传递的参数是object类型的,但是实际使用时,传递的myPeople的类型却是Person类型,CompareName这个函数也要求要object类型的参数,这种签名不一致的情况为什么可以运行?
2016年12月29日 07点12分 1
level 13
这是 Option Strict Off 带来的类型转换
建议把这个改成泛型的,而且去掉多余的下划线。
_
2016年12月29日 08点12分 2
我设置的是Option Strict On。另外下划线是换行用的,只是美观问题,不影响代码运行。这段代码我是抄的书上的原文。我不理解的是,委托要求函数签名要严格一致,但是本来要求传入object参数的地方偏偏传入person参数,居然还可以正确运行。
2016年12月29日 08点12分
另外,无论是Option Strict On还是off,都能正确运行。
2016年12月29日 08点12分
回复 liqiochi : 你把下划线删掉,看看报错吗? 很多情况下的下划线早就不强制你写了。如果Option Strict On也正常运行,那就是因为Person类是从Object类派生的,而不是发生隐式转换。 _
2016年12月29日 08点12分
@Nukepayload2 下划线去了也能运行,我都写习惯了[黑线]。你的意思是不是委托不用签名完全一致,只要传入的类是其子类即可?但object类是所有类的基类,按照你的意思,string类也是object类派生的,但是我将string类传入显然不行。
2016年12月29日 11点12分
1