2014-09-19 2 views
2

나는 다음과 같은 코드가 있습니다DirectCast 오류

Imports System.Collections.ObjectModel 

Public Class clsCellListExtender 

    Public Class List(Of T) 
     Inherits Collection(Of T) 

     Private _iID As Integer = 0 

     Protected Overrides Sub InsertItem(index As Integer, item As T) 
      'your checks here 

      If TypeOf (item) Is clsCell Then 
       _iID += 1 
       Dim nCell As clsCell = DirectCast(item, clsCell) 
       nCell.TempID = _iID 
      End If 

      MyBase.InsertItem(index, item) 
     End Sub 

    End Class 

End Class 

나는 그것을 컴파일하려고하면 컴파일러가 라인

Dim nCell As clsCell = DirectCast(item, clsCell) 

수 누군가에 "T는 clsCell로 변환 할 수 없습니다"라고 나에게 이야기를 내가 뭘 잘못했는지 말해줘?

감사합니다.

+0

'List (Of T) '라는 내부 클래스를 사용하는 데 문제가 있습니다. – Plutonix

+0

왜 문제가 있습니까? – tmighty

답변

1

여기서 문제는 T이 개체에만 국한되지 않는다고 생각합니다. 객체이거나 사실상 clsCell 클래스의 조상이 필요합니다. (단지 Object가 모든 유형의 조상이므로 DirectCast가 항상 작동합니다). 다음의 예를 생각해

Dim p As String 
If TypeOf p Is Integer Then 

End If 

컴파일러는이 경우에 불평 할 것이다 : 유형의

표현 '문자열'유형의 '정수'가 될 수 없다.

경우에 따라 TclsCell 사이에 상속 관계가 있는지 컴파일러에서 확인할 수 없습니다. 대부분의 경우 그들은 하나가 아니므로 DirectCast를 사용할 수 없습니다.

해결책은 TryCast와 같은 다른 캐스트 연산자를 사용하는 것이므로 적어도 컴파일 타임 오류는 발생하지 않습니다. 또한 List(Of T)이. NET의 표준 유형이기 때문에 여기에서해야 할 것을 설명하면 가장 좋습니다. 따라서 다른 것을 만들면 혼동을 일으킬 수 있습니다.

동일한 로직을 사용하여 TypeOf 라인에서 실패 할 것으로 예상됩니다. 어쩌면 다른 사람이 이것에 대해 자세히 설명 할 수 있습니다.

+1

적어도 TryCast는 더 이상 오류를 발생시키지 않습니다. 수정하기 위해 더 많은 오류가 아직 남아 있으므로 아직 테스트 할 수 없지만 작동하는 것 같습니다. – tmighty

+1

옙, 큰 도움에 감사드립니다! – tmighty