Ich habe ein seltsames Verhalten bei der Verwendung von generischen Typen und Null-Operator. Warum gibt obj2.CurrentDate einen Datumswert zurück, der bei der Verwendung von? Falsch erscheint? (kurze Hand). Wenn ich den Nulloperator (if) in der Eigenschaft aushändige, gibt er den korrekten und erwarteten Wert zurück. Ich dachte das? war das Äquivalent zu if (Ausdruck, returnIfTrue, returnIfFalse).Null (?) Operator gibt falschen Wert zurück, wenn generischer Typkonstruktor verwendet wird. VB.NET
Wenn der generische Typkonstruktor entfernt wird, funktioniert der Nulloperator ebenfalls wie erwartet. Warum ist das?
Return If(CurrentObject1 IsNot Nothing, CurrentObject1.MyDate, Nothing) -- Long Hand Returns correct value
Return CurrentObject1?.MyDate --Short Hande - Returns incorrect value
erste Konsole-Anwendung - mit generischem Typ-Konstruktor ist nicht Current, was erwartet wird.
Module Module1
Sub Main()
Dim obj1 As New MyObject1 With {.MyDate = CDate("2017-11-13T14:25:00Z")}
Dim obj2 As New MyObject2(Of MyObject1)(obj1)
Console.WriteLine(obj1.MyDate)
Console.WriteLine(obj2.CurrentDate)
Console.ReadKey()
End Sub
End Module
Public MustInherit Class MyBaseObject1
Property MyDate As Date
End Class
Public Class MyObject1
Inherits MyBaseObject1
End Class
Public Class MyObject2(Of MyObjectType As {MyBaseObject1, New})
Public Sub New(obj As MyObjectType)
m_CurrentObject1 = obj
End Sub
Private m_CurrentObject1 As MyObjectType = Nothing
Public ReadOnly Property CurrentObject1 As MyObjectType
Get
Return m_CurrentObject1
End Get
End Property
Public ReadOnly Property CurrentDate As Date?
Get
Return CurrentObject1?.MyDate
End Get
End Property
End Class
Ausgabe der Konsole-Anwendung 1
11/13/2017 8:25:00 AM
2/24/0010 4:56:53 AM
2. Konsole-Anwendung - Ohne generischen Typkonstruktor. Arbeitet erwartet als
Module Module1
Sub Main()
Dim obj1 As New MyObject1 With {.MyDate = CDate("2017-11-13T14:25:00Z")}
Dim obj2 As New MyObject2(obj1)
Console.WriteLine(obj1.MyDate)
Console.WriteLine(obj2.CurrentDate)
Console.ReadKey()
End Sub
End Module
Public MustInherit Class MyBaseObject1
Property MyDate As Date
End Class
Public Class MyObject1
Inherits MyBaseObject1
End Class
Public Class MyObject2
Public Sub New(obj As MyBaseObject1)
m_CurrentObject1 = obj
End Sub
Private m_CurrentObject1 As MyBaseObject1 = Nothing
Public ReadOnly Property CurrentObject1 As MyBaseObject1
Get
Return m_CurrentObject1
End Get
End Property
Public ReadOnly Property CurrentDate As Date?
Get
Return CurrentObject1?.MyDate
End Get
End Property
End Class
Ausgabe der zweiten Konsolenanwendung
11/13/2017 8:25:00 AM
11/13/2017 8:25:00 AM
Sie sollten die Werte bearbeiten, die es in der Frage ausgibt - es würde es wahrscheinlicher machen, jemandes Interesse zu pique. Ich bekomme "24/02/0010 04:56:53" mit dem Code wie gezeigt, und wenn ich 'Property MyDate als Date 'verwende, bekomme ich" 01/01/0001 00:28:38 " –
Beachten Sie, dass VB 'Nothing' ist eher C# '' Default (T) 'als' NULL'. So ist zum Beispiel der * Typ * Ihres ersten Ausdrucks 'Datum', * nicht *' Datum? '. –
Siehe [Bemerkenswert ähnliche Code in Frage fragen über den Rückgabetyp von 'IF()'] (https://stackoverflow.com/a/12595889/15498) –