8

的背景

我已经使用 DeveloperFusion.com 上的转换器将下面的 C# 代码(在 TreeViewAdv 文件 TreeColumn.cs 中找到)转换为 VB.net 代码。

C#

using System;
//...(other using calls)

namespace Aga.Controls.Tree
{
    [TypeConverter(typeof(TreeColumn.TreeColumnConverter)), DesignTimeVisible(false), ToolboxItem(false)]
    public class TreeColumn : Component
    {
        private class TreeColumnConverter : ComponentConverter
        {
            public TreeColumnConverter()
                : base(typeof(TreeColumn))
            {
            }

            public override bool GetPropertiesSupported(ITypeDescriptorContext context)
            {
                return false;
            }
        }
     }
    //…Some, I believe, unrelated code
}

VB

Imports System.Collections.Generic
‘...(other Imports calls)

Namespace Aga.Controls.Tree

    <TypeConverter(GetType(TreeColumn.TreeColumnConverter)), DesignTimeVisible(False), ToolboxItem(False)> _
    Public Class TreeColumn
        Inherits Component

        Private Class TreeColumnConverter
            Inherits ComponentConverter

            Public Sub New()
                MyBase.New(GetType(TreeColumn))
            End Sub

            Public Overrides Function GetPropertiesSupported(ByVal context As ITypeDescriptorContext) As Boolean
                Return False
            End Function
        End Class
    ‘...some, I believe, unrelated code
End Class

问题

在这行 C# 代码中访问 TreeColumn.TreeColumnConverter 就可以了。[TypeConverter(typeof(TreeColumn.TreeColumnConverter)), DesignTimeVisible(false), ToolboxItem(false)]

但是,VB.Net 不允许在转换后的行中访问该成员:

错误描述如下: Aga.Controls.Tree.TreeColumn.TreeColumnConverter' is not accessible in this context because it is 'Private'。但是,在这两种情况下,TreeColumn.TreeColumnConverter 都被声明为 Private。

问题

1.) 为什么。由于这对我来说是一个学习项目,所以我想知道为什么范围在两种语言之间的行为不同。这是他们两个中比较重要的一个问题。

2.) 如何。更改 VB 代码以允许 TreeColumnConverter 访问已识别的代码行而不打开范围以致可能在其他地方造成命名混淆的最佳方法是什么?我可以将其声明为 Public,但我想有一种更正确的方法。

回答时要记住的事情

1.) 我知道在 VB.net 中,私有成员在声明它们的对象之外不可用。所以告诉我这不会有帮助,在我看来这不是一个答案。

4

2 回答 2

5

在我看来,不同的编译器在处理嵌套的私有类型时使用了不同的理念。C# 说可以从更高级别类型的属性访问它,VB.NET 说不是。也许那些哲学甚至不是故意的。

无论如何,要在 VB.NET 中修复它,您可以使用TypeConverterAttribute使用字符串而不是 a 的构造函数,Type并将完全限定的嵌套类型名称作为字符串:

<TypeConverter("Aga.Controls.Tree.TreeColumn.TreeColumnConverter"), DesignTimeVisible(False), ToolboxItem(False)> _
Public Class TreeColumn
  ...
于 2013-11-02T00:47:08.887 回答
0

啊,我相信我看到了你的问题。

这是命名空间。

VB.NET 链接命名空间。

Namespace Aga.Controls.Tree在 vb.net 中实际上是您项目的默认命名空间与文件中声明的命名空间连接。

实际上Aga.Controls.Tree.Aga.Controls.Tree,它可能只是无法到达它需要的范围,因为它指向了错误的命名空间。

C#,您完全限定了命名空间... DevFusion 的转换器(与 SharpDevelop IDE 中使用的转换器相同)不知道这一点。

于 2013-11-02T00:28:36.657 回答