我知道System.Nullable(Of T)結構的存在。爲什麼調用Ctype在運行時失敗,從int轉換爲泛型?
我想寫一個類來取代它:Nullable(Of T)類[VB代碼下面]。但是,當我測試Nullable(Of T)類(請參閱NullableOfTClassTest類,Method Main)時,使用CType運算符從System.Int32進行轉換時會發生異常。
爲什麼在運行時發生這種情況,爲什麼我的Ctype操作符方法不被調用?
注意:代碼下面重新排序和減少爲了hilite問題。
Namespace MyNamespace
Public NotInheritable Class NullableOfTClassTest
Private Sub New()
End Sub
Public Shared Sub Main()
Dim dic as new Dictionary(Of String, Object) FROM {{"5", 5}}
Dim Y as MyNamespace.Nullable(Of System.Int32) =
CType(dic.Item("5"), MyNamespace.Nullable(Of Integer))
End Sub
End Class
Public NotInheritable Class Nullable(Of T As {Structure})
'I think this operator should be called by the code above
Public Shared Widening Operator CType(ByVal x As T) As
MyNamespace.Nullable(Of T)
Return New MyNamespace.Nullable(Of T)(x)
End Operator
Public Shared Narrowing Operator CType(ByVal x As
MyNamespace.Nullable(Of T)) As T
If (x Is Nothing) OrElse (Not x.HasValue) Then Throw New InvalidCastException
Return x.Value
End Operator
Private _Value As T
Private _HasValue As Boolean = False
Public Sub New()
End Sub
Public Sub New(ByVal value As T)
Me.Value = value
End Sub
Public Property Value As T
Get
If Not Me.HasValue Then Throw New InvalidOperationException(
"El objeto que acepta valores Null debe tener un valor.")
Return Me._Value
End Get
Set(ByVal value As T)
Me._Value = value
Me._HasValue = True
End Set
End Property
Public ReadOnly Property HasValue As Boolean
Get
Return Me._HasValue
End Get
End Property
Public Shadows Function ToString() As String
If Me.HasValue Then
Return Me.Value.ToString
Else
Return Nothing
End If
End Function
End Class
End Namespace
這是什麼問題?這是一個問題和解答網站。 – Greg
- 平等比較工作正常; ==使用「取消」比較規則,並將*做正確的事情* - 拳擊工程絕對好;空框爲空,否則該值被裝箱;沒有瘋狂;同樣拆開「T」或「T」按預期工作 - 重新開課;這裏要說的一點就是保留值類型的行爲012b- re DbNull - 這不是一個語言概念;爲什麼要有特殊的待遇?你會驚訝於我不會使用'DbNull'的頻率... 然而,重新DbNull你可以通過擴展方法來做到這一點。可以肯定的是,對於大多數人來說它是過度殺傷性的。 –
現在...有沒有真正的問題?這是不是顯示和告訴... –