背景
我已使用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访问已识别的代码行而不打开范围以至于可能在其他地方创建命名混淆的最佳方法是什么?我可以宣布它是公开的,但我想有一个更正确的方法。
回答时要记住的事项
1。)我知道在VB.net中私有成员在声明它们的对象外部不可用。所以告诉我这不会有帮助,在我看来不是答案。
答案 0 :(得分:5)
对我来说,在处理嵌套的私有类型时,看起来不同的编译器使用不同的哲学。 C#表示可以从更高级别类型的属性访问它,VB.NET说它不是。也许那些哲学甚至都不是故意的。
无论如何,要在VB.NET中修复它,您可以使用使用字符串而不是Type
的{{3}}构造函数,并将完全限定的嵌套类型名称作为字符串:
<TypeConverter("Aga.Controls.Tree.TreeColumn.TreeColumnConverter"), DesignTimeVisible(False), ToolboxItem(False)> _
Public Class TreeColumn
...
答案 1 :(得分:0)
这是名称空间。
VB.NET链接命名空间。
vb.net中的 Namespace Aga.Controls.Tree
实际上是您项目的默认命名空间,与文件中声明的命名空间连接在一起。
它实际上是Aga.Controls.Tree.Aga.Controls.Tree
因此它可能无法达到它需要的范围,因为它指向错误的命名空间。
C#,你完全符合命名空间...... DevFusion的转换器(与SharpDevelop IDE中使用的转换器相同)不知道这一点。