2011-04-08 2 views
2

J'ai pris du code d'un projet C# et l'ai placé dans un convertisseur. Le code original était:Erreur DirectCast (False, Nullable (Of Boolean))

(Nullable<bool>)false 

et le convertisseur dit l'équivalent VB est:

DirectCast(False, Nullable(Of Boolean)) 

J'ai même compilé le projet C# et regardé dans le réflecteur. Il a donné le même code VB comme ci-dessus, mais cela génère l'erreur:

Value of type 'Boolean' cannot be converted to 'Boolean?' 

Comment puis-je lancer ce bien?

Plus Code comme demandé:

Imports System.Windows 
Imports System.Windows.Controls.Primitives 
Imports System.Windows.Input 

Public Class VirtualToggleButton 

    Public Shared ReadOnly IsCheckedProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsChecked", _ 
      GetType(Nullable(Of Boolean)), _ 
      GetType(VirtualToggleButton), _ 
      New FrameworkPropertyMetadata(DirectCast(False, Nullable(Of Boolean)), _ 
      FrameworkPropertyMetadataOptions.BindsTwoWayByDefault Or _ 
      FrameworkPropertyMetadataOptions.Journal, _ 
      New PropertyChangedCallback(AddressOf OnIsCheckedChanged))) 

      Public Shared Function GetIsChecked(ByVal d As DependencyObject) As Nullable(Of Boolean) 
     Return DirectCast(d.GetValue(IsCheckedProperty), Nullable(Of Boolean)) 
    End Function 

      Public Shared Sub SetIsChecked(ByVal d As DependencyObject, ByVal value As Nullable(Of Boolean)) 
     d.SetValue(IsCheckedProperty, value) 
    End Sub 

      Private Shared Sub OnIsCheckedChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) 
     Dim pseudobutton As UIElement = TryCast(d, UIElement) 
     If pseudobutton IsNot Nothing Then 
      Dim newValue As Nullable(Of Boolean) = DirectCast(e.NewValue, Nullable(Of Boolean)) 
      If newValue = True Then 
       RaiseCheckedEvent(pseudobutton) 
      ElseIf newValue = False Then 
       RaiseUncheckedEvent(pseudobutton) 
      Else 
       RaiseIndeterminateEvent(pseudobutton) 
      End If 
     End If 
    End Sub 


      Public Shared ReadOnly IsThreeStateProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsThreeState", _ 
          GetType(Boolean), _ 
          GetType(VirtualToggleButton), _ 
          New FrameworkPropertyMetadata(CBool(False))) 

      Public Shared Function GetIsThreeState(ByVal d As DependencyObject) As Boolean 
     Return CBool(d.GetValue(IsThreeStateProperty)) 
    End Function 

      Public Shared Sub SetIsThreeState(ByVal d As DependencyObject, ByVal value As Boolean) 
     d.SetValue(IsThreeStateProperty, value) 
    End Sub 


      Public Shared ReadOnly IsVirtualToggleButtonProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsVirtualToggleButton", _ 
           GetType(Boolean), _ 
           GetType(VirtualToggleButton), _ 
           New FrameworkPropertyMetadata(CBool(False), _ 
             New PropertyChangedCallback(AddressOf OnIsVirtualToggleButtonChanged))) 

      Public Shared Function GetIsVirtualToggleButton(ByVal d As DependencyObject) As Boolean 
     Return CBool(d.GetValue(IsVirtualToggleButtonProperty)) 
    End Function 

      Public Shared Sub SetIsVirtualToggleButton(ByVal d As DependencyObject, ByVal value As Boolean) 
     d.SetValue(IsVirtualToggleButtonProperty, value) 
    End Sub 

      Private Shared Sub OnIsVirtualToggleButtonChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) 
     Dim element As IInputElement = TryCast(d, IInputElement) 
     If element IsNot Nothing Then 
      If CBool(e.NewValue) Then 
       AddHandler element.MouseLeftButtonDown, New MouseButtonEventHandler(AddressOf VirtualToggleButton.OnMouseLeftButtonDown) 
       AddHandler element.KeyDown, New KeyEventHandler(AddressOf VirtualToggleButton.OnKeyDown) 
      Else 
       RemoveHandler element.MouseLeftButtonDown, New MouseButtonEventHandler(AddressOf VirtualToggleButton.OnMouseLeftButtonDown) 
       RemoveHandler element.KeyDown, New KeyEventHandler(AddressOf VirtualToggleButton.OnKeyDown) 
      End If 
     End If 
    End Sub 


      Friend Shared Function RaiseCheckedEvent(ByVal target As UIElement) As RoutedEventArgs 
     If target Is Nothing Then 
      Return Nothing 
     End If 

     Dim args As New RoutedEventArgs() 
     args.RoutedEvent = ToggleButton.CheckedEvent 
     [RaiseEvent](target, args) 
     Return args 
    End Function 

      Friend Shared Function RaiseUncheckedEvent(ByVal target As UIElement) As RoutedEventArgs 
     If target Is Nothing Then 
      Return Nothing 
     End If 

     Dim args As New RoutedEventArgs() 
     args.RoutedEvent = ToggleButton.UncheckedEvent 
     [RaiseEvent](target, args) 
     Return args 
    End Function 

      Friend Shared Function RaiseIndeterminateEvent(ByVal target As UIElement) As RoutedEventArgs 
     If target Is Nothing Then 
      Return Nothing 
     End If 

     Dim args As New RoutedEventArgs() 
     args.RoutedEvent = ToggleButton.IndeterminateEvent 
     [RaiseEvent](target, args) 
     Return args 
    End Function 


    Private Shared Sub OnMouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs) 
     e.Handled = True 
     UpdateIsChecked(TryCast(sender, DependencyObject)) 
    End Sub 

    Private Shared Sub OnKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) 
     If e.OriginalSource Is sender Then 
      If e.Key = Key.Space Then 
            If (Keyboard.Modifiers And ModifierKeys.Alt) = ModifierKeys.Alt Then 
        Return 
       End If 

       UpdateIsChecked(TryCast(sender, DependencyObject)) 

       e.Handled = True 
      ElseIf e.Key = Key.Enter AndAlso CBool(TryCast(sender, DependencyObject).GetValue(KeyboardNavigation.AcceptsReturnProperty)) Then 
       UpdateIsChecked(TryCast(sender, DependencyObject)) 
       e.Handled = True 
      End If 
     End If 
    End Sub 

    Private Shared Sub UpdateIsChecked(ByVal d As DependencyObject) 
     Dim isChecked As Nullable(Of Boolean) = GetIsChecked(d) 
     If isChecked = True Then 
      SetIsChecked(d, If(GetIsThreeState(d), DirectCast(Nothing, Nullable(Of Boolean)), DirectCast(False, Nullable(Of Boolean)))) 
     Else 
      SetIsChecked(d, isChecked.HasValue) 
     End If 
    End Sub 

    Private Shared Sub [RaiseEvent](ByVal target As DependencyObject, ByVal args As RoutedEventArgs) 
     If TypeOf target Is UIElement Then 
      TryCast(target, UIElement).[RaiseEvent](args) 
     ElseIf TypeOf target Is ContentElement Then 
      TryCast(target, ContentElement).[RaiseEvent](args) 
     End If 
    End Sub 

End Class 
+0

Pouvez-vous poster un peu plus du code afin que nous puissions voir ce que d'autre se passe et qu'est-ce que vous essayez de faire? Cette ligne en elle-même ne signifie pas grand chose (au moins pour moi). – TKTS

Répondre

1

Il semble que vous pouvez simplement supprimer le DirectCast. De ce que je vois vous passez un faux dans une fonction/méthode qui a un booléen? (ou Nullable (of Boolean)) en tant que paramètre. VB n'a pas besoin de la conversion explicite requise par C# (bien que ce ne soit pas une mauvaise idée dans certains cas). Pour un exemple simple,

Private Function DoSomething(byval param as Boolean?) as Boolean? 
    'do something and return a Nullable(of Boolean) 
End Function 

DoSomething(false) 'is just fine, no DirectCast needed 
DoSomething(nothing) 'is also fine 
DoSomething(true) 'fine 

DoSomething(DirectCast(false, Nullable(of Boolean)) 'will give you the error you described 

Tout comme une note de côté, au cas où il est source de confusion Nullable (de Boolean) et Boolean? signifie la même chose qui est que c'est une variable booléenne qui peut avoir une valeur de vrai, faux ou rien.

+0

Merci, ça marche très bien. –

1

TKTS est exact que VB ne normalement pas besoin de la distribution explicite, mais, pour être complet, la conversion « correcte » serait:

New Boolean?(False) 
+0

C'est ce dont j'avais besoin! ¡Muchos gracias! – Edward

Questions connexes