2013-04-02 3 views
0

아래의 코드를 살펴 보시기 바랍니다 :일반 다형성

Public Class Student 
    Public Sub PassList(ByVal StudentList As List(Of Student)) 
     Dim s1 As New Student 
     Dim s2 As New Student 
     Dim s3 As New Student 
     StudentList.Add(s1) 
     StudentList.Add(s2) 
     StudentList.Add(s3) 
    End Sub 

    Public Sub TestReturnList() 
     Dim list As List(Of PostGraduate) 
     PassList(list) 
    End Sub 

End Class 

Public Class PostGraduate 
    Inherits Student 
End Class 

Public Class PostUndergraduate 
    Inherits Student 
End Class 

컴파일러 오류가 있습니다 :

Value of type 'System.Collections.Generic.List(Of WindowsApplication1.PostGraduate)' cannot be converted to 'System.Collections.Generic.List(Of WindowsApplication1.Student)

내가 오류에 대한 이유를 이해합니다. 해결 방법이 있습니까?

+0

"해결 방법이 있습니까?" -'PassList' 내에서'StudentList'가 * 사용되는 방식에 달려 있습니다. 그것만이 반복되면, @ Neolisk의 대답이 적절합니다. 다른 작업을 수행하는 경우 해결 방법이 있는지 확인하기 위해 목록을 사용하여 수행 할 작업을 Google에 알려줘야합니다. –

+0

@Damien_The_Unbeliever, 질문에 더 많이 추가했습니다. 감사. – w0051977

+0

해결 방법이 있다고 생각하지 않습니다. 호출자 ('TestReturnList')는'PassList'를 호출 한 후에도'List (Of Postgroduate)'를 반복하면'PostGraduate' (또는에서 파생 된 타입)이 발견된다는 매우 합리적인 기대를 가지고 있습니다 그것). 이리스트에 평범한 '학생'을 찾을 수는 없을 것입니다. –

답변

1

귀하의 질문은 입니다. 이 변경 시도 : 이것에

Public Sub PassList(ByVal StudentList As List(Of Student)) 

End Sub 

을 : 제네릭 형식 매개 변수에 대한

Public Sub PassList(ByVal StudentList As IEnumerable(Of Student)) 

End Sub 

분산가 .NET 4.0의 새로운 기능입니다.

Covariance and Contravariance here에 대해 자세히 알아보십시오.

+0

불행히도 이것은 나를 위해 작동하지 않습니다 (나는 질문에 더 많이 추가했습니다). 감사. – w0051977

+0

다른 해결 방법이 있습니까? – w0051977

+0

@ w0051977 :이 'Dim list as List of (Postgroduate)'를이 'Dim list As List (Of Student)'로 변경하십시오. 아니요, Postgraduate 학생을 추가하는 것을 방해하지 않습니다. – Neolisk