2011-04-08 89 views
2

我從C#項目中提取了一些代碼並將其放入轉換器中。原來的代碼是:DirectCast(False,Nullable(Of Boolean))錯誤

(Nullable<bool>)false 

和轉換器說VB相當於是:

DirectCast(False, Nullable(Of Boolean)) 

我甚至編譯C#項目,並在反射看着它。它給出了與上面相同的VB代碼,但是這會產生錯誤:

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

如何正確投射?根據要求

更多的代碼:

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

你可以張貼一些代碼,所以我們可以看到什麼其他事情還在繼續,你正在嘗試做什麼?這條線本身並不意味着太多(至少對我而言)。 – TKTS 2011-04-08 13:28:39

回答

1

看起來你可以只取出DirectCast。從我看到你傳遞一個false到一個布爾函數/方法? (或Nullable(布爾值))作爲參數。 VB不需要C#需要的顯式轉換(儘管在某些情況下它不是一個壞主意)。舉個簡單的例子,

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 

正如一個側面說明,在情況下,它是混淆了可空(布爾)和布爾?意味着它是一個布爾變量,它可以具有true,false或nothing的值。

+0

謝謝,這很好。 – 2011-04-11 17:02:18

1

TKTS是正確的,VB,通常並不需要顯式強制轉換,但是,對於完整性,「正確」的轉換將是:

New Boolean?(False) 
+0

這就是我需要的! ¡Muchos gracias! – Edward 2014-09-12 18:39:10

相關問題