从C#转换为VB.NET的代码中的奇怪错误

时间:2012-10-11 06:07:52

标签: c# vb.net dependency-properties

  

可能重复:   Method group in VB.NET?

在阅读an answer时,我收到了这段代码:

public static class Helper
{
    public static bool GetAutoScroll(DependencyObject obj)
    {
        return (bool)obj.GetValue(AutoScrollProperty);
    }

    public static void SetAutoScroll(DependencyObject obj, bool value)
    {
        obj.SetValue(AutoScrollProperty, value);
    }

    public static readonly DependencyProperty AutoScrollProperty =
        DependencyProperty.RegisterAttached("AutoScroll", typeof(bool),
        typeof(Helper),
        new PropertyMetadata(false, AutoScrollPropertyChanged));

    private static void AutoScrollPropertyChanged(DependencyObject d,
        DependencyPropertyChangedEventArgs e)
    {
        var scrollViewer = d as ScrollViewer;

        if (scrollViewer != null && (bool)e.NewValue)
        {
            scrollViewer.ScrollToBottom();
        }
    }
}

因为我在VB.NET中工作,所以我转换它并获得:

Public NotInheritable Class Helper

    Private Sub New()
    End Sub

    Public Shared Function GetAutoScroll(ByVal obj As DependencyObject)
    As Boolean
        Return CBool(obj.GetValue(AutoScrollProperty))
    End Function

    Public Shared Sub SetAutoScroll(ByVal obj As DependencyObject,
    ByVal value As Boolean)
        obj.SetValue(AutoScrollProperty, value)
    End Sub

    Public Shared ReadOnly AutoScrollProperty As DependencyProperty =
        DependencyProperty.RegisterAttached("AutoScroll", GetType(Boolean),
        GetType(Helper),
        New PropertyMetadata(False, AutoScrollPropertyChanged)) // Error Here

    Private Shared Sub AutoScrollPropertyChanged(ByVal d As
    System.Windows.DependencyObject, ByVal e As
    System.Windows.DependencyPropertyChangedEventArgs)
        Dim scrollViewer = TryCast(d, ScrollViewer)

        If scrollViewer IsNot Nothing AndAlso CBool(e.NewValue) Then
            scrollViewer.ScrollToBottom()
        End If
    End Sub

End Class

但是C#代码编译并且工作正常,但在VB.NET中,代码会出错(在代码中标记):

  

未为'Private Shared Sub AutoScrollPropertyChanged(d As System.Windows.DependencyObject,e As System.Windows.DependencyPropertyChangedEventArgs)'的参数'e'指定参数

Eenter image description here

我错过了什么? PropertyChangedCallback委托与对象浏览器中定义的方式完全相同:

Public Delegate Sub PropertyChangedCallback(
    ByVal d As System.Windows.DependencyObject, ByVal e As
    System.Windows.DependencyPropertyChangedEventArgs)

2 个答案:

答案 0 :(得分:8)

C#具有语言功能,可以将方法组转换为委托类型。所以,而不是:

private void Foo() {}
private void Bar(Action arg) {}

Bar(new Action(Foo));

你可以写:

Bar(Foo);

我不是VB人,但我怀疑,VB .NET没有这样的功能。 您似乎需要AddressOf运营商:

New PropertyMetadata(False, AddressOf AutoScrollPropertyChanged)

答案 1 :(得分:4)

我没有编译它,但我认为你应该使用AddressOf运算符引用AutoScrollPropertyChanged:

Public Shared ReadOnly AutoScrollProperty As DependencyProperty =
        DependencyProperty.RegisterAttached("AutoScroll", GetType(Boolean),
        GetType(Helper),
        New PropertyMetadata(False, AddressOf AutoScrollPropertyChanged))