2013-11-01 6 views
8

SfondoModificatore di visibilità "privato": come gestire le differenze durante la conversione di C# in VB?

Ho convertito il codice C# di sotto (trovato in TreeColumn.cs di file TreeViewAdv) in codice VB.net utilizzando il convertitore trovato alla 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 

Il problema

L'accesso a TreeColumn.TreeColumnConverter in questa riga del codice C# va bene. [TypeConverter (typeof (TreeColumn.TreeColumnConverter)), DesignTimeVisible (false), ToolboxItem (false)]

Tuttavia, VB.Net non consente l'accesso a tale membro nella linea convertito:

L'errore descrizione legge: Aga.Controls.Tree.TreeColumn.TreeColumnConverter' is not accessible in this context because it is 'Private'. Tuttavia, in entrambi i casi TreeColumn.TreeColumnConverter viene dichiarato privato.

The Question (s)

1.) The Why. Poiché questo è un progetto di apprendimento per me, mi piacerebbe sapere perché gli ambiti si comportano in modo diverso tra le due lingue. Questa è la domanda più importante tra i 2 di loro.

2.) Il come. Qual è il modo migliore (s) per modificare il codice VB per consentire l'accesso di TreeColumnConverter alla riga di codice identificata senza aprire l'ambito al punto che potenzialmente crea confusione di denominazione altrove? Potrei semplicemente dichiararlo pubblico, ma immagino ci sia un approccio più corretto a questo.

cose da tenere a mente quando si risponde

1.) So che in VB.net membri privati ​​non sono disponibili esterni all'oggetto in cui sono state dichiarate. Quindi dirmi questo non sarà utile e nella mia mente non è una risposta.

+0

chiaro per me perché questo richiede una risposta gigante. Basta cambiarlo da privato ad amico. VB.NET è un linguaggio amichevole. –

+0

@HansPassant Dovresti postare una risposta, mentre tu non mi dai il WHY, questo è un HOW valido. La risposta di Jordao è anche valida. Se riesci a convincermi che la tua metodologia è migliore, ti darò la "risposta accettata". – ProtoNoob

risposta

5

Per me, sembra che i diversi compilatori utilizzino diverse filosofie quando trattano con tipi privati ​​nidificati.C# dice che è OK per accedervi da un attributo nel tipo di livello superiore, VB.NET dice che non lo è. Forse quelle filosofie non erano nemmeno intenzionali.

In ogni caso, per risolvere il problema in VB.NET è possibile utilizzare il TypeConverterAttribute costruttore che utilizza una stringa invece di un Type, e mettere il nome del tipo annidato pienamente qualificato come una stringa:

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

Grazie per le informazioni, dopo aver fatto qualche ricerca in più sull'attributo TypeConverter sembra una correzione valida, ma anche Hans Passant è un buon punto. Ci sono dei vantaggi, nella tua mente, su quale sarebbe meglio? Probabilmente darò una risposta a questa discussione. – ProtoNoob

+0

Cambierete l'accessibilità del tipo annidato rendendolo 'Friend' (' internal' in C#). Potrebbe essere accessibile da qualsiasi altro tipo nello stesso assembly. –

+0

Vero, e in effetti quella era la mia preoccupazione iniziale, ma sono prudente nell'usare una costante lì. C'è qualche ragione per credere che GetType (TreeColumn.TreeColumnConverter) restituisca ogni valore diverso da "Aga.Controls.Tree.TreeColumn.TreeColumnConverter"? Non penserei, ma questo non è il mio codice e non ho ancora capito tutte le metodologie (ma sto cercando di imparare). – ProtoNoob

0

Ah, credo di vedere il tuo problema.

Sono gli spazi dei nomi.

VB.NET Catene i Namespace.

Namespace Aga.Controls.Tree in vb.net sarebbe in realtà lo spazio dei nomi predefinito del progetto concatenato con lo spazio dei nomi dichiarato nel file.

In realtà sarebbe Aga.Controls.Tree.Aga.Controls.Tree quindi è probabile che non riesca a raggiungere lo scopo che deve essere perché punta allo spazio dei nomi sbagliato.

C#, si qualificano completamente gli spazi dei nomi ... Il convertitore di DevFusion (uguale a quello utilizzato nell'IDE di SharpDevelop) non lo sa.

+0

Sei sicuro che sia questo il problema? L'hai provato? –

+0

Sono sicuro? No ... la configurazione di tutti di Visual Studio è una sparatoria. Salto avanti e indietro dal progetto VB.NET al C# quotidianamente e quando devo convertirne uno (di solito usando gli stessi dlls usi fusion) mi imbatto sempre nei namespace concatenando se stessi e buttando fuori tutto da whack. Ho già eseguito l'accesso ai campi privati ​​nidificati senza dover utilizzare TypeConverter ... quindi sono davvero in perdita. –

+0

@Steiner Dove puoi convertire le dlls dev fusion? Non ho visto alcun tipo di collegamento ad esso sul loro sito web e voglio cimentarmi nella scrittura di un'applicazione desktop di conversione batch ... Se non ne hanno già uno. – ProtoNoob

Problemi correlati