2013-11-01 2 views
8

Der Hintergrund"Private" Sichtbarkeitsmodifikator - wie behandelt man Unterschiede bei der Konvertierung von C# nach VB?

ich den unter C# -Code umgewandelt haben in VB.net Code mit dem Konverter bei DeveloperFusion.com gefunden (in TreeViewAdv Datei TreeColumn.cs gefunden).

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 

Das Problem

Zugang zu TreeColumn.TreeColumnConverter in dieser Zeile des Codes C# ist in Ordnung. [Typeconverter (typeof (TreeColumn.TreeColumnConverter)), Designtime (false), ToolboxItem (false)]

jedoch VB.Net erlauben keinen Zugriff auf dieses Element in die umgewandelte Zeile:

Der Fehler Beschreibung liest: Aga.Controls.Tree.TreeColumn.TreeColumnConverter' is not accessible in this context because it is 'Private'. In beiden Fällen wird TreeColumn.TreeColumnConverter jedoch als Privat deklariert.

Die Frage (n)

1.) Das Warum. Da dies ein Lernprojekt für mich ist, würde ich gerne wissen, warum die Bereiche sich in den beiden Sprachen unterschiedlich verhalten. Dies ist die wichtigere Frage unter den 2 von ihnen.

2.) Das Wie. Was ist der beste Weg, den VB-Code so zu ändern, dass TreeColumnConverter auf die angegebene Codezeile zugreifen kann, ohne den Bereich so weit zu öffnen, dass möglicherweise an anderer Stelle Benennungsverwechslungen entstehen? Ich könnte es nur öffentlich erklären, aber ich stelle mir vor, dass es einen richtigeren Ansatz dafür gibt.

Dinge im Auge zu behalten, wenn

1. Answering) Ich weiß, dass in VB.net Privat Mitglieder außerhalb des Objekts nicht verfügbar sind, in der sie deklariert wurden. Also sagt mir, dass dies nicht hilfreich ist und in meinen Gedanken keine Antwort ist.

+0

nicht so klar zu mir, warum dies eine riesige Antwort erfordert. Ändern Sie einfach von Privat zu Freund. VB.NET ist eine freundliche Sprache. –

+0

@HansPassant Sie sollten dies als Antwort posten, während Sie mir nicht das WARUM gegeben haben, das ist ein gültiges WIE. Jordao Antwort ist auch ein gültiges wie. Wenn Sie mich davon überzeugen können, dass Ihre Methode besser ist, gebe ich Ihnen die "Angenommene Antwort". – ProtoNoob

Antwort

5

Für mich sieht es so aus, dass die verschiedenen Compiler verschiedene Philosophien verwenden, wenn verschachtelte private Typen behandelt werden.C# sagt, dass es OK ist, um von einem Attribut auf dem höheren Level-Typ darauf zuzugreifen, VB.NET sagt, dass es nicht ist. Vielleicht waren diese Philosophien nicht einmal beabsichtigt.

Wie dem auch sei, es in VB.NET beheben Sie den TypeConverterAttribute Konstruktor verwenden könnte, die eine Zeichenfolge anstelle eines Type verwendet, und setzen Sie den vollständig qualifizierten verschachtelte Typnamen als String:

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

Danke für die Info, nach ein wenig mehr Forschung über das TypeConverter-Attribut sieht es wie eine gültige Lösung aus, aber Hans Passant macht auch einen guten Punkt. Gibt es Vorteile in Ihrem Kopf, was wäre besser? Ich werde wahrscheinlich eine Antwort auf diese Diskussion vergeben. – ProtoNoob

+0

Sie ändern die Zugänglichkeit des verschachtelten Typs, indem Sie ihn als "Friend" ("intern" in C#) festlegen. Auf andere Typen in derselben Baugruppe kann zugegriffen werden. –

+0

Stimmt, und das war meine ursprüngliche Sorge, aber ich bin vorsichtig, eine Konstante dort zu verwenden. Gibt es einen Grund zu der Annahme, dass GetType (TreeColumn.TreeColumnConverter) alle einen anderen Wert als "Aga.Controls.Tree.TreeColumn.TreeColumnConverter" zurückgeben würde? Ich würde nicht denken, aber das ist nicht mein Code und ich verstehe noch nicht alle Methoden (aber ich versuche es zu lernen). – ProtoNoob

0

Ah, ich glaube, ich sehe dein Problem.

Es sind die Namespaces.

VB.NET kettet die Namespaces.

Namespace Aga.Controls.Tree in Vb.net wäre eigentlich der Standard-Namespace Ihres Projekts verkettet mit dem Namespace in der Datei deklariert.

Es wäre tatsächlich Aga.Controls.Tree.Aga.Controls.Tree, so dass es wahrscheinlich nur nicht zum Geltungsbereich gelangen kann, weil es auf den falschen Namespace zeigt.

C#, Sie qualifizieren Namespaces vollständig ... Der DevFusion-Konverter (wie der in SharpDevelop IDE verwendete) weiß das nicht.

+0

Sind Sie sicher, dass das Problem ist? Hast du es versucht? –

+0

Bin ich sicher? Nein ... die Konfiguration von Visual Studio ist ein Mist-Shoot. Ich spreche täglich von VB.NET zu C# -Projekt und wenn ich eines in das andere konvertieren muss (normalerweise benutze ich die gleichen dlls dev fusion uses), laufe ich immer in die Namespaces, die sich verketten und alles aus dem Gleichgewicht bringen. Ich habe schon früher verschachtelte private Felder aufgerufen, ohne dass ich TypeConverter verwenden musste ... also bin ich wirklich ratlos. –

+0

@Steiner Wo kann man die dlls dev fusion verwenden, um zu konvertieren? Ich habe auf ihrer Website noch keinen Link dazu gesehen, und ich möchte versuchen, eine Batch-Konverter-Desktop-Anwendung zu schreiben ... Wenn sie noch keine haben. – ProtoNoob

Verwandte Themen