2013-11-01 1 views
8

Фон«Частный» модификатор видимости - как обрабатывать различия при преобразовании C# в VB?

Я преобразовал С # код ниже (найденный в TreeColumn.cs файлов TreeViewAdv) в VB.net кода, используя преобразователь найти на DeveloperFusion.com.

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 

Проблема

Доступ к TreeColumn.TreeColumnConverter в этой строке C# код нормально. [TypeConverter (TypeOf (TreeColumn.TreeColumnConverter)), DesignTimeVisible (ложь), ToolboxItem (ложь)]

Однако 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

Не то, очевидно, для меня, почему это требует гигантского ответа. Просто измените его с Частного на Друга. VB.NET - это дружелюбный язык. –

+0

@ HansPassant. Вы должны опубликовать это как ответ, хотя вы не дали мне ПОЧЕМУ, это действительно КАК. Ответ Жордао также действителен. Если вы сможете убедить меня, что ваша методология лучше, я дам вам «Принятый ответ». – ProtoNoob

ответ

5

Для меня, похоже, что разные компиляторы используют разные философии при работе с вложенными частными типами.C# говорит, что его ОК для доступа к нему из атрибута более высокого уровня, VB.NET говорит, что это не так. Возможно, эти философии не были даже преднамеренными.

В любом случае, чтобы исправить это в VB.NET можно использовать TypeConverterAttribute конструктор, который использует строку вместо Type, и помещаем полностью квалифицированное имя типа вложенного в виде строки:

<TypeConverter("Aga.Controls.Tree.TreeColumn.TreeColumnConverter"), DesignTimeVisible(False), ToolboxItem(False)> _ 
Public Class TreeColumn 
    ... 
+0

Благодарим за информацию, сделав немного больше исследований по атрибуту TypeConverter, это похоже на действительное исправление, но Ханс Пассент также делает хорошую точку. Есть ли в вашем распоряжении преимущества, относительно которых было бы лучше? Вероятно, я получу ответ на эту дискуссию. – ProtoNoob

+0

Вы измените доступность вложенного типа, сделав его «Друг» ('internal' в C#). Доступ к нему может быть любым другим типам в одной и той же сборке. –

+0

Правда, и на самом деле это была моя первоначальная забота, но я осторожно использую постоянную там. Есть ли основания полагать, что GetType (TreeColumn.TreeColumnConverter) вернет значение, отличное от «Aga.Controls.Tree.Column.TreeColumnConverter»? Я бы не подумал, но это не мой код, и я пока не совсем понимаю все методологии (но я пытаюсь учиться). – ProtoNoob

0

Ах, я считаю, что вижу вашу проблему.

Это пространства имен.

VB.NET Цепи пространства имен.

Namespace Aga.Controls.Tree В vb.net фактически будет пространство имен по умолчанию вашего проекта, объединенное с пространством имен, объявленным в файле.

Фактически это будет Aga.Controls.Tree.Aga.Controls.Tree, поэтому он, вероятно, просто не может добраться до области, в которой он нуждается, потому что он указывает на неправильное пространство имен.

C#, вы полностью квалифицируете пространства имен ... Конвертер DevFusion (тот же, что используется в среде разработки SharpDevelop) не знает об этом.

+0

Вы уверены, что в этом проблема? Ты это пробовал? –

+0

Я уверен? Нет. Конфигурация каждого из Visual Studio - это дерьмовая стрельба. Я прыгаю вперед и назад от VB.NET до проекта C# каждый день, и когда мне приходится конвертировать один в другой (обычно используя те же DLL-файлы, с которыми работает слияние fusion), я всегда сталкиваюсь с пространствами имен, которые объединяются и выбрасывают все из-под удара. Я получил доступ к вложенным частным полям, прежде чем без использования TypeConverter ... так что я нахожусь в недоумении. –

+0

@Steiner Где вы можете использовать dlls dev fusion для преобразования? Я не видел никакой ссылки на него на своем веб-сайте, и я хочу попробовать свои силы при написании настольного приложения для пакетного конвертирования ... Если у них их еще нет. – ProtoNoob