2017-11-14 1 views
1

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

+0

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 " –

+0

Beachten Sie, dass VB 'Nothing' ist eher C# '' Default (T) 'als' NULL'. So ist zum Beispiel der * Typ * Ihres ersten Ausdrucks 'Datum', * nicht *' Datum? '. –

+0

Siehe [Bemerkenswert ähnliche Code in Frage fragen über den Rückgabetyp von 'IF()'] (https://stackoverflow.com/a/12595889/15498) –

Antwort

0

Ja , das sieht wie ein Compiler Bug aus. Wird es in Kürze beheben. In der Zwischenzeit können Sie die folgende Problemumgehung verwenden: DirectCast (CurrentObject1, MyBaseObject1)? MyDate

+1

Ein weiteres Opfer dieses Fehlers [ist hier] (https://stackoverflow.com/q/48824474/17034). Ich habe mich gefragt, woher diese Roslyn-Frage könnte kommen, sieht aus wie Benutzer # 8982039 ist eigentlich AlekseyTs. –

Verwandte Themen