2

C#プロジェクトからいくつかのコードを取得し、それをコンバーターに入れました。元のコードは次のとおりです。

(Nullable<bool>)false

コンバーターによると、VBに相当するものは次のとおりです。

DirectCast(False, Nullable(Of Boolean))

C#プロジェクトをコンパイルして、Reflectorで確認しました。上記と同じ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
4

2 に答える 2

1

DirectCastを削除できるようです。私が見たところ、ブール値を持つ関数/メソッドにfalseを渡していますか?(またはNullable(of Boolean))をパラメーターとして使用します。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

補足として、Nullable(ブール値)とブール値を混同している場合に備えて?同じことを意味します。つまり、true、false、または何も値をとることができないブール変数です。

于 2011-04-08T14:06:53.437 に答える
1

TKTSは、VBが通常明示的なキャストを必要としないことは正しいですが、完全を期すために、「正しい」変換は次のようになります。

New Boolean?(False)
于 2013-02-02T16:23:16.770 に答える